Java8 数据流

Wesley13
• 阅读 686

一、基本知识

**数据流(stream)**是对集合(collection)功能的增强,更专注于对集合对象的各种便利、高效的聚合,大批量数据操作。

数据流的特点:

  • 元素序列 - 流提供了一组特定类型的以顺序方式元素。
  • 源 - 流使用集合,数组或I/O资源为输入源。
  • 聚合操作 - 数据流支持如filter, map, limit, reduced, find, match等聚合操作。
  • 管道传输 - 大多数流操作的返回流本身使他们的结果可以被管道传输。
  • 自动迭代 - 流操作内部做了反复对比,其中明确迭代需要集合提供源元素。

Collection接口有两个方法来生成流:

  • stream() -返回顺序流考虑集合作为其源。
  • parallelStream() - 返回并行数据流考虑集合作为其源。

二、使用示例

测试类:

/**
 * 数据流测试
 *
 * @author Kevin
 * @date 2017-01-28
 */
public class StreamTest {

    public static void main(String args[]) {
        List<String> strings = Arrays.asList("Alphabet", "", "Tesla Motors", "SpaceX", "", "Blue origin");
        System.out.println("List: " + strings);

        // filter方法用于消除基于标准元素
        long count = strings.stream().filter(string -> string.isEmpty()).count();
        System.out.println("Empty Strings count: " + count);

        count = strings.stream().filter(string -> string.length() == 6).count();
        System.out.println("Strings of length 6 count: " + count);

        // 收集器是用来处理组合在一个数据流的元素的结果
        List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        System.out.println("Filtered List: " + filtered);
        String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
        System.out.println("Merged String: " + mergedString);

        List<Integer> numbers = Arrays.asList(4, 4, 2, 8, 8, 5);
        System.out.println("numbers List: " + numbers);
        // map方法用于映射每个元素对应的结果
        List<Integer> squaresList = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
        System.out.println("Squares List: " + squaresList);

        // 计算统计数据
        List<Integer> integers = Arrays.asList(1, 12, 21, 16, 24, 34);
        System.out.println("List: " + integers);
        IntSummaryStatistics stats = integers.stream().mapToInt((x) -> x).summaryStatistics();

        System.out.println("Highest number in List : " + stats.getMax());
        System.out.println("Lowest  number in List : " + stats.getMin());
        System.out.println("Sum of all numbers : " + stats.getSum());
        System.out.println("Average of all  numbers : " + stats.getAverage());

        Random random = new Random();
        System.out.println("Random Numbers: ");

        // limit 方法用于减少流的大小
        // sorted方法用于流排序
        // 数据流提供了新的forEach方法遍历该流中的每个元素
        random.ints().limit(10).sorted().forEach(System.out::println);

        // parallelStream是流进行并行处理的替代方案
        count = strings.parallelStream().filter(string -> string.isEmpty()).count();
        System.out.println("Empty Strings: " + count);
    }

}

运行结果:

List: [Alphabet, , Tesla Motors, SpaceX, , Blue Origin]
Empty Strings count: 2
Strings of length 6 count: 1
Filtered List: [Alphabet, Tesla Motors, SpaceX, Blue Origin]
Merged String: Alphabet, Tesla Motors, SpaceX, Blue Origin
numbers List: [4, 4, 2, 8, 8, 5]
Squares List: [16, 4, 64, 25]
List: [1, 12, 21, 16, 24, 34]
Highest number in List : 34
Lowest  number in List : 1
Sum of all numbers : 108
Average of all  numbers : 18.0
Random Numbers: 
-2106309174
-1591609963
-1105970115
-455066830
242292433
929670242
1008846372
1047231272
1812276130
1941752343
Empty Strings: 2

####三、参考文章 1.Java8数据流(http://www.yiibai.com/java8/java8_stream.html)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java Stream
1Stream简介Stream是数据渠道,用于操作数据源(集合,数组等)所生成得元素序列。而集合讲得是数据,流讲得是计算。注意:Stream自己不会存储元素。Stream不会改变源对象。相反,它会返回一个持有结果得新StreamStream操作时延迟执行得,这意味着它们会等到需要结果时才执
Wesley13 Wesley13
3年前
Java IO输入输出
学前知道Java的IO使用“流”的概念来表示。IO流涉及到数据源和目的地。流,是从源“流向”目的的数据流。Java将各种数据源和目标之间数据的传输统一抽象为流,通过对流对象的操作来完成I/O功能。输入输出实际都是对内存而言的。数据源可以是键盘、文件、应用程序、鼠标、网络连接。
Wesley13 Wesley13
3年前
JDK1.8 之Stream API总结
Stream是Java8新增加的类,用来补充集合类。Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。Stream和其它集合类的区别在于:其它集合类主要关注与有限数量的数据的访问和有效管理(增删改),而Stream并没有提供访问和管理元素的方式,而是通过声明数据源的方式,利用可计算的操作在数据源上执行,当然
Wesley13 Wesley13
3年前
Java8系列之Stream总结
流的简介  官方解释,Stream是Java8的一大亮点,它与java.io包里的InputStream和OutputStream是完全不同的概念。它也不同于StAX对XML的解析的Stream,也不是AmazonKinesis对大数据实时处理的Stream。它是对集合对象功能的增强,她专注于对集合对象进行各种非常便利、高效的聚合操作(ag
Wesley13 Wesley13
3年前
JDK8之lambda表达式
/JDK8Stream特性Createdbychengbxon2018/5/27.Java8中的Stream是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregateoperation),或者大批量数据操
Stella981 Stella981
3年前
Leetcode 703. 数据流中的第K大元素
1.题目要求设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。你的KthLargest 类需要一个同时接收整数 k和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用KthLargest.add,返回当前数据流中第K大的元素。示例:
Wesley13 Wesley13
3年前
Java8 新特性之集合操作Stream
Java8新特性之集合操作StreamStream简介Java8引入了全新的StreamAPI。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。
Stella981 Stella981
3年前
C#对象序列化(Serialize)与反序列化(Deserialize)
.NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。可以使用\Serializable\属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用\Non