Java8新特性——stream流

一、基本API初探

package java8.stream;

import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * @author [email protected]
 * @version 1.0
 * @name
 * @description
 * @date 2018/7/15
 */
public class BasicTest {
    public static void main(String[] args) {

        //创建串行流
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
        List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        filtered.forEach(System.out::println);

        //使用foreach进行数据迭代 limit 方法用于获取指定数量的流
        Random random = new Random();
        random.ints().limit(10).forEach(System.out::println);

        //Map用于映射每个元素对应的结果,原值为i 映射到i*i .collect(Collectors.toList()):将stream再转换回list集合
        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        // 获取对应的平方数
        List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().limit(2).collect(Collectors.toList());
        squaresList.forEach(System.out::println);

        //filter 方法用于通过设置的条件过滤出元素
        List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
        // 获取空字符串的数量
        Long count = stringList.stream().filter(string -> string.isEmpty()).count();
        System.out.println("The count of empty string:"+count);

        //sorted用于对流进行排序,默认是从小到大
        List<Integer> array = Arrays.asList(1,3,2,4);
        List<Integer> sortedList = array.stream().sorted().collect(Collectors.toList());
        sortedList.forEach(System.out::println);

        //流并行处理程序parallelStream
        List<String> stringList2 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl","");
        // 获取空字符串的数量
        Long count2 = stringList2.parallelStream().filter(string -> string.isEmpty()).count();
        System.out.println("The count of empty string:"+count2);

        //collectors 可以返回列表或者字符串
        List<String> stringList3 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl","");
        String mergedString = stringList3.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
        System.out.println("合并字符串: " + mergedString);

        //
        int[] numberList =  {12,3,34,67,100,99};

        IntStream intStream = IntStream.of(numberList);
        IntSummaryStatistics stats = intStream.summaryStatistics();

        System.out.println("列表中最大的数 : " + stats.getMax());
        System.out.println("列表中最小的数 : " + stats.getMin());
        System.out.println("所有数之和 : " + stats.getSum());
        System.out.println("平均数 : " + stats.getAverage());
    }
}

二、分组和合并

 1 /**
 2  * @author [email protected]
 3  * @version 1.0
 4  * @name
 5  * @description 分组、合并测试dto
 6  * @date 2018/7/15
 7  */
 8 public class Foo {
 9
10     private int code;
11
12     private int count;
13
14     public Foo(int code, int count) {
15         this.code = code;
16         this.count = count;
17     }
18
19     public int getCode() {
20         return code;
21     }
22
23     public void setCode(int code) {
24         this.code = code;
25     }
26
27     public int getCount() {
28         return count;
29     }
30
31     public void setCount(int count) {
32         this.count = count;
33     }
34
35     @Override
36     public String toString() {
37         return "Foo{" +
38                 "code=" + code +
39                 ", count=" + count +
40                 ‘}‘;
41     }
42 }
/**
 * @author [email protected]
 * @version 1.0
 * @name
 * @description 测试分组和合并  groupingBy方法以及reduce方法
 * @date 2018/7/15
 */
public class TestFoo {
    public static void main(String[] args) {
        Foo foo1 = new Foo(1, 2);
        Foo foo2 = new Foo(2, 23);
        Foo foo3 = new Foo(2, 6);
        List<Foo> list = new ArrayList<>(4);
        list.add(foo1);
        list.add(foo2);
        list.add(foo3);
        Map<Integer, List<Foo>> collect = list.stream().collect(Collectors.groupingBy(Foo::getCode));
        //存储最后的汇总结果集合
        List<Foo> result = new ArrayList<>();
        collect.forEach((k,v)->{
            Optional<Foo> sum = v.stream().reduce(
                    (v1, v2) -> {  //合并
                        v1.setCount(v1.getCount()+v2.getCount());
                        return v1;
                    }
            );
            result.add(sum.orElse(new Foo(0,10)));
        });
        result.forEach(System.out::print);

    }
}

将2号记录的count值进行了合并汇总!23+6=29

原文地址:https://www.cnblogs.com/jiaqingshareing/p/9313569.html

时间: 2024-10-07 20:53:56

Java8新特性——stream流的相关文章

java8 新特性 Stream流 分组 排序 过滤 多条件去重

private static List<User> list = new ArrayList<User>(); public static void main(String[] args) { list = Arrays.asList( new User(1, "a", 10), new User(4, "d", 19), new User(5, "e", 13), new User(2, "b", 1

Java8 新特性 Stream 无状态中间操作

无状态中间操作 Java8 新特性 Stream 练习实例 中间无状态操作,可以在单个对单个的数据进行处理.比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)... 过滤 filter 映射 map 扁夹化 flatMap 遍厉 peek 过滤 filter 接收一个谓词断言,boolean Pridicate< T > 根据返回值类型来确定是否过滤这一条属性. // 过滤 filter @Test public void filterTest() { list.stre

Java8 新特性 Stream 短路终端操作

短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 noneMatch 查找首个 findFirst 查找任意 findAny 匹配所有 allMatch //匹配所有 allMatch @Test public void allMatchTest() { boolean b = list.stream() //所有的商品价格都大于40 .allMatch(

Java8 新特性 Stream 非短路终端操作

非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大值 max 最小值 min 聚合 collect 计数 count 遍厉 forEach //遍厉 forEach @Test public void forEachTest() { list.stream() .forEach(iter -> //以json格式输出 System.out.prin

Java8 新特性之流式数据处理

一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现. 比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现: List<Integer> evens = new ArrayList<>(); for (final Integer num : nums) { if (num % 2 =

Java8 新特性 Stream() 创建流

通过Controllere类的Stream()和parallelStream()创建流 //通过集合创建流 @Test public void test1() { String arr[] = new String[]{"a", "b", "c"}; //把数组转换成集合 List<String> list = Arrays.asList(arr); //生成stream流(串行流) Stream<String> stre

Java8新特性Stream API与Lambda表达式详解(1)

1 为什么需要Stream与Lambda表达式? 1.1  为什么需要Stream Stream作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggr

java8新特性——并行流与顺序流

在我们开发过程中,我们都知道想要提高程序效率,我们可以启用多线程去并行处理,而java8中对数据处理也提供了它得并行方法,今天就来简单学习一下java8中得并行流与顺序流. 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. Java8中将并行流进行了优化,我们可以很容易的对数据进行并行操作.Stream API可以声明性地通过parallel()与scqucntial()在并行流与顺序流之间进行切换. 一.Fork-Join框架 Fork-Join框架:是java7提供

java8 新特性 Stream

1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的Iterator.原始版本的Iterator,用户只能一个一