程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

Lambda表达式和Stream入门

发布于2021-06-12 14:54     阅读(658)     评论(0)     点赞(9)     收藏(4)


什么是Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。

语法及重要特征

(parameters) -> expression
或
(parameters) ->{ statements; }
  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
// 此处 new ArrayList<Integer>() 仅用于表示一个Integer的list
// forEach可以接收一个lambda表达式作为参数,并遍历list每个元素执行这个表达式的内容
new ArrayList<Integer>().forEach((x) -> {
    // x 被自动识别为Integer类型
    System.out.println(x);
});
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
// 上段示例可省略参数的小括号
new ArrayList<Integer>().forEach(x -> {
    System.out.println(x);
});
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
// 上段示例可省略大括号
new ArrayList<Integer>().forEach(x -> System.out.println(x));
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
new ArrayList<Integer>().stream().map(x -> x * 2);
// 等价于
new ArrayList<Integer>().stream().map(x -> {
    return x * 2;
});

变量作用域

  • lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
final int y = 0;
new ArrayList<Integer>().forEach(x -> {
    System.out.println(x + y);
    // 将x的值赋给
});
  • lambda 表达式的局部变量可以不用显式声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
int y = 0;
new ArrayList<Integer>().forEach(x -> {
    System.out.println(x + y);
});
// y值被修改时编译报错
// y = 1;
  • 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
int x = 0;
// 表达式内变量x编译报错
// new ArrayList<Integer>().forEach(x -> System.out.println(x));

什么是 Stream

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

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

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

生成流

  • stream() - 为集合创建串行流

  • parallelStream() - 为集合创建并行流

处理流

  • map() - 用于映射每个元素到对应的结果

  • filter() - 用于通过设置的条件过滤出元素

  • sorted() - 用于对流进行排序

  • limit() - 用于获取指定数量的流

结束流

  • forEach() - 迭代流中的每个数据

  • collect() - 实现了很多归约操作,例如将流转换成集合和聚合元素

  • getMax()、getMin()、getSum()、getAverage() - 产生统计结果的收集器,主要用于int、double、long等基本类型上


示例


List<String> list = Arrays.asList("123", "abc");
// 为集合创建串行流
list.stream()
        // 映射每个元素到对应的结果,转为大写
        .map(String::toUpperCase)
        // 通过设置的条件过滤出元素,字符串长度为3
        .filter(string -> string.length() == 3)
        // 迭代流中的每个数据,打印元素
        .forEach(System.out::println);

// 创建IntStream
new Random().ints()
        // 转换成Stream<String>
        .mapToObj(Integer::toString)
        // 获取指定数量的流, 10个
        .limit(10)
        // 对流进行默认排序
        .sorted()
        // 将流转换成map,toMap三个参数分别表示map的key生成方式、value生成方式、key冲突时value解决方式
        .collect(Collectors.toMap(key -> key, value -> value, (value1, value2) -> value1));

原文链接:https://blog.csdn.net/shepherd_dirk/article/details/117667571



所属网站分类: 技术文章 > 博客

作者:java小王子

链接:http://www.javaheidong.com/blog/article/222423/5ecf5e6eb6a2c6e324c1/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)