java8-Stream流_处理list数组_简单了解


支持顺序和并行聚合操作的一系列元素。

看一个JAVA 8_API(地址:https://www.matools.com/api/java8)的示例:

int sum = widgets.stream() 
        .filter(w -> w.getColor() == RED)
        .mapToInt(w -> w.getWeight())
        .sum();

分析:widgetsCollection<Widget>,通过Collection.stream()创建一个Widget对象的流, .filter()——过滤这个流以产生仅包含红色小部件的流(这个过滤,我觉得换成保留较好,filter()
就是保留满足方法内条件的数据
),然后过滤保留后的值,通过mapToInt方法转换为表示每个红色小部件的权重的int值。 然后将该流相加以产生总重量。
除了Stream ,其为对象引用的流,存在原语特为IntStream , LongStreamDoubleStream ,所有这些都称为“流”和符合此处描述的特征和限制。
用途:对集合元素进行筛选、排序和聚合等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

 实例:

public static void main(String[] args) {

        
        List<String> strings = Arrays.asList("aa","","bbbb","","cc","","dddd");
        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5,1,2,9,132);


        System.out.println("java 8  操作数组-------");
        System.out.println("数组:" + strings);
        Long nullCount = strings.stream()
                .filter(s -> s.isEmpty())
                .count();
        List<String> nullStrings = strings.stream()
                .filter(s -> s.isEmpty())
                .collect(Collectors.toList());
        System.out.println("空字符串的数量:" + nullCount);
        System.out.println("空字符串:" + nullStrings);

        Long threeCount = strings.stream()
                .filter(s -> s.length()>3)
                .count();
        List<String> threeStrings = strings.stream()
                .filter(s -> s.length()>3)
                .collect(Collectors.toList());
        System.out.println("长度大于三的字符串的数量:" + threeCount);
        System.out.println("长度大于三的字符串:" + threeStrings);


        String joinStrings = strings.stream()
                .filter(s -> s.length()>3)
                .collect(Collectors.joining(","));
        System.out.println("合并字符串:" + joinStrings);

        //获取平方数
        System.out.println("数字 数组------------------");
        List<Integer> squaresList = numbers.stream()
                .map(integer -> integer*integer)
                .distinct() //去重
                .collect(Collectors.toList());
        System.out.println("获取平方数:" + squaresList);

        IntSummaryStatistics statistics = numbers.stream()
                .mapToInt(s->s)
                .summaryStatistics();
        System.out.println("列表中最大的数 : " + statistics.getMax());
        System.out.println("列表中最小的数 : " + statistics.getMin());
        System.out.println("所有数之和 : " + statistics.getSum());
        System.out.println("平均数 : " + statistics.getAverage());
        System.out.println("随机数: ");
        Random random = new Random();
        random.ints().limit(10).sorted().forEach(System.out::println);

        // 并行处理
        List<String> parallelString = strings.parallelStream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        System.out.println("空字符串的数量为: " + parallelString);
    }

输出结果:

java 8 操作数组-------
数组:[aa, , bbbb, , cc, , dddd]
空字符串的数量:3
空字符串:[, , ]
长度大于三的字符串的数量:2
长度大于三的字符串:[bbbb, dddd]
合并字符串:bbbb,dddd
数字 数组------------------
获取平方数:[9, 4, 49, 25, 1, 81, 17424]
列表中最大的数 : 132
列表中最小的数 : 1
所有数之和 : 169
平均数 : 15.363636363636363
随机数:
-1605871186
-930090087
-760378224
-160815069
-155865019
-78365962
795529794
909733837
1127503219
1774549966
空字符串的数量为: [aa, bbbb, cc, dddd]

Process finished with exit code 0

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM