Java8Stream流

Stream流呢,以前我也有所了解,像一些面试题中也出现过,Java8的新特性,有一块就是这个Stream操作集合,而且在看一些项目中也使用的比较多。但总感觉自己学的一知半解,所以今天打算系统的过一下,再巩固巩固。

概念

Stream是JDK8 API中的新成员,它允许以声明性方式处理集合。

流程

1、把集合转换为流Stream
2、操作Stream流

Stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果

一些常见的中间操作和中止操作

  1. 中间操作(过滤、映射、限制…),可以多个
方法名 方法作用 返回值类型 方法类型
filter 过滤 Stream 中间操作
map 映射(转换)接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素 Stream 中间操作
peek 窥探 Stream 中间操作
skip 跳过前几个 Stream 中间操作
limit 截取前几个 Stream 中间操作
distinct 去重操作(比较的是地址) Stream 中间操作
sorted 排序操作 Stream 中间操作
  1. 终止操作(最常见的是收集),只可以设置1个
方法名 方法作用 返回值类型 方法类型
collect 收集处理结果 泛型 终止操作
count 统计个数 long 终止操作
forEach 逐一处理 void 终止操作
reduce 汇总操作 Optional<> 该对象有get方法可以获取返回值 终止操作

Stream的3个注意事项:

  • Stream中间操作方法返回的是新的流
  • Stream不调用终结方法,中间的操作不会执行
  • Stream只能调用一次终止操作。得到结果后,不能再次使用这个流。
下面是一些小demo
点击查看代码
/**
     * 过滤集合中不符合条件的元素
     */
    @Test
    public void testfilter(){
        List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl");
        List<String> aList = stringList.stream().filter(str -> str.contains("a")).collect(Collectors.toList());
        aList.forEach(System.err::println);
    }

    /**
     *去重
     */
    @Test
    public void testDistinct(){
        List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
        List<String> distinctStr = stringList.stream().distinct().collect(Collectors.toList());
        distinctStr.forEach(System.out::println);
        //--------------------------------
        Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
        Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
        Product prod3 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
        ArrayList<Product> proList = Lists.newArrayList(prod1, prod2, prod3);
        List<Product> distinctProList = proList.stream().distinct().collect(Collectors.toList());
        distinctProList.forEach(System.out::println);
    }

    /**
     * limit(n)获取流中的前n个元素
     */
    @Test
    public void testLimit(){
        List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
        List<String> limitStr = stringList.stream().limit(3).collect(Collectors.toList());
        System.out.println(limitStr);
    }

    /**
     * skip(n)
     */
    @Test
    public void testSkip(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<String> skipStrList = stringList.stream().skip(2).collect(Collectors.toList());
        System.out.println(skipStrList);
    }

    /**
     * map() 接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素
     */
    @Test
    public void testMap(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<String> mapStrList = stringList.stream().map(str -> str.concat("_map")).collect(Collectors.toList());
        System.out.println(mapStrList);
    }

    @Test
    public void testSorted(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<String> sortedStrList = stringList.stream().sorted().collect(Collectors.toList());
        System.out.println(sortedStrList);
    }

    /**
     * collect():将流转换为其他形式 list set map
     */
    @Test
    public void testCollect(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        Set<String> collectSet = stringList.stream().collect(Collectors.toSet());
        System.out.println(collectSet);
    }

    /**
     * 将流中元素反复结合起来得到一个结果
     */
    @Test
    public void testReduce(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        Optional<String> reduce = stringList.stream().reduce((acc, item) -> {return acc + item;});
        if (reduce.isPresent()) System.out.println(reduce.get());
    }

    /**
     * 将流中元素反复结合起来得到一个结果
     */
    @Test
    public void testCount(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        long count = stringList.stream().count();
        System.out.println(count);
    }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Java8Stream流