zoukankan      html  css  js  c++  java
  • Java 8 Lambda 表达式及 Stream 在集合中的用法

    简介

    虽然 Java 8 已经发布有一段时间了,但是关于 Java 8 中的 Lambda 表达式最近才开始系统的学习,刚开始就被 Stream 的各种骚操作深深的吸引住了,简直漂亮的不像 Java。我认为每一个用 Java 的都应该深入的学习一下,不仅可以写出漂亮的代码,更可以对代码进行更深层次的抽象。

    Stream

    Java 8 中新新增了 Stream(流) 类来简化集合类的使用,Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作;那 Stream 又是什么呢?我们知道, Java 中所有的集合都是基于 Collection 接口的扩展,在 Java 8 中新增了 stream() 方法来获取 Stream 对象,方法如下:

    default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
    }

    注意:default 也是 Java 8 中新引入的关键字,用于定义接口中方法的默认实现 。
    所以 Java 中所有的集合都包含这个方法,我们可以通过 stream() 方法获取这个集合的 Stream 对象。


    先来看一个简单的使用案例以便更深入的理解:
    对一个 List 求和一般的代码需要这么写:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    int sum = 0;
    for (int i = 0; i < list.size(); i++) {
    sum += list.get(i);
    }
    System.out.println(sum);

    这样的样板代码我们可能每天都要写个好多遍,非常繁琐,而且容易出错,可读性差,下面改成 Stream 方式:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    int sum = list.stream().reduce(0, (acc, value) -> acc + value);
    System.out.println(sum);

    改成这样一目了然,代码非常干净利索,上面代码先通过 stream() 方法获取 Stream 对象,然后调用 Stream 中的 reduce 方法计算,然后获取结果(这里先不用考虑 reduce 是什么,后面会详细介绍);
    上面便是 Stream 的一次简单操作。下面来具体说一下。
    Stream 中主要包含如下几个方法:

    方法名 简介
    collect(toList()) 通过 Stream 生成一个列表
    map 将流中的一个值转换成一个新的值
    filter 过滤 Stream 中的元素
    flatMap 将多个 Stream 连接成一个 Stream
    max 求最大值
    min 求最小值
    reduce 从一组值中生成一个新的值
    上面就是 Stream 中包含的几个主要方法,下面逐一对其介绍:

    collect(toList()) & filter

    collect(toList()) 的作用是通过一个 Stream 对象生成 List 对象,案例:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> result = list.stream().filter((value) -> value > 2).collect(toList());
    result.forEach((value) -> System.out.print(value));

    上面的代码先创建了一个 List 对象并初始化,然后筛选出大于 2 的值,输出。
    filter 方法的作用是过滤 Stream 中的元素,filter 方法是一个高阶函数,接收一个函数接口作为参数,此高阶函数返回一个 boolean 值,返回 true 的元素会保留下来;
    collect(toList()) 方法将 filter 操作返回的 Stream 生成一个 List。

    高阶函数:接收或返回一个函数接口的函数称为高阶函数。
    函数接口:只包含一个函数的接口成为函数接口。
    map

    map 函数的作用是将流中的一个值转换成一个新的值,举个例子,我们要将一个 List 转换成 List ,那么就可以使用 map 方法,示例代码:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    List<String> result = list.stream().map(value -> String.format("String:%s", value)).collect(toList());
    result.forEach(System.out::print);
    1
    2
    3
    map 方法将 Integer 元素转换成 String 并使用 collect(toList()) 方法生成一个新的 List。

    System.out::print 是 (value) -> System.out.print(value) 的简化版写法。
    flatMap

    flatMap:将多个 Stream 连接成一个 Stream,这个怎么理解呢,举个栗子:
    首先定义一个 List 对象,将这个对象中的每一个 String 都分割成一个字母并生成一个新的 List 对象,代码:

    List<String> list = Arrays.asList("abc", "def", "ghi");
    List<Character> result = list.stream().flatMap(value -> {
    char[] chars = value.toCharArray();
    Character[] characters = new Character[chars.length];
    for(int i = 0; i < characters.length; i++){
    characters[i] = chars[i];
    }
    return Stream.of(characters);
    }).collect(toList());
    result.forEach(System.out::println);

    上面代码先遍历 list ,通过 flatMap 函数将每个 String 元素都生成一个新的 Stream 并将这些 Stream 连接成一个新的 Stream。

    max&min

    求最大值最小值,这个很好理解了,直接看代码:

    List<Integer> list = Arrays.asList(0, 1, 2, 3);
    Comparator<Integer> comparator = (o1, o2) -> o1.compareTo(o2);
    System.out.println(list.stream().min(comparator).get());
    System.out.println(list.stream().max(comparator).get());

    min 和 max 函数需要一个 Comparator 对象为参数作为比对依据。

    reduce

    从一组值中生成一个新的值,reduce 函数其实用途非常广泛,作用也比较大,我们举一个累加的例子:

    List<Integer> list = Arrays.asList(0, 1, 2, 3);
    int count = list.stream().reduce(0, (acc, item) -> acc + item).intValue();
    System.out.println(count);

    reduce 函数的一个参数为循环的初始值,这里计算累加时初始值为 0,acc 代表已经计算的结果,item 表示循环的每个元素。

    到此 Stream 中的几个常用方法就介绍完了,其他方法可以自己 Stream 代码。


    原文:https://blog.csdn.net/u013872857/article/details/79439444

  • 相关阅读:
    npm 一些常用的命令
    Angular Encapsulation
    隐藏scrollbar
    Vue生命周期详解(1)- 单个组件
    如何自己制作iconfont
    day07-2018-10--25 深浅拷贝
    day06-2018-10--24 小数据池和编码
    day05-2018-10--23 字典
    day04-2018-10--22python基础
    day03-2018-10-19-python基础
  • 原文地址:https://www.cnblogs.com/keyi/p/10475304.html
Copyright © 2011-2022 走看看