1.概述

Lamda和Stream都是jdk8的新特性,十分实用

Lamda是对匿名函数类的简化,极大提高了代码的简洁性

Steam流是对数据进行处理的流

2.Lambda

()->{} 是通用的lambda表达式

在jdk中在java.util.function包中给我们定义了很多通用型函数接口

在下面介绍4种常见的通用型接口

Comsumer消费型

void accept(T t);  接收一个参数没有返回值
        List.of(1,3, 3).forEach(System.out::println);

Function 函数型

R apply(T t);
System.out.println(toUpperCase("abc", String::toUpperCase));
static String toUpperCase(String s,Function<String,String> function){return function.apply(s);
}
interface StringUtils{String toUpperCase(String s,Function<String,String> function);}

Supplier 供给型

T get()
//获得4-8的的4个数集合
System.out.println(getRandomList(4,()->(int)(Math.random()*(8-4+1))+4));static List<Integer> getRandomList(int s,Supplier<Integer> function){List<Integer> list = new ArrayList<>();for (int i = 1;i<=s;i++){list.add(function.get());}return list;}
interface RandomList{List<Integer>  getRandomList(int s,Supplier<Integer> function);
}

Preducate断言型

boolean test(T t)
 System.out.println(getFilterList(List.of("abc","ab","aer","ab","adf","adg"),(s)->!s.equals("ab")));static List<String>  getFilterList(List<String> s,Predicate<String> function){List<String> list = new ArrayList<>();for (String str:s){if (function.test(str)) {list.add(str);}}return list;}
interface FilterList{List<String>  getFilterList(List<String> s,Predicate<String> function);
}

3.函数引用

方法引用是一种lambda表达式的一种简化

类似于通过对象去调用方法

对象::实例方法

数据类型::静态方法

数据类型::实列方法        参数的第一个当对象使用去调用方法

构造器引用    数据类型::new

规则:

1.Lambda中的参数列表和返回值必须要和Lambda体中的参数列表和返回值一一对应

2.Lambda的返回类型必须和方法体中的返回类型一致

lambda表达式只有一个参数作为对象去调用方法或者是作为参数被调用。

lambda表达式存在多个参数第一个参数作为对象去调用方法其他参数作为方法参数一一对应。

对象::实列方法

List.of(1,3, 3).forEach(System.out::println);

引用类型::实列方法

BiPredicate<String,String> pre2 = String::equals;

类名::静态方法

 Comparator<Integer> com2 =Integer::compare;System.out.println(com2.compare(100,102));

引用类型::new

Supplier<Employee> employee = Employee::new;
Function<String,Employee> employee2 = Employee::new;
//调用无参构造
System.out.println(employee.get());
//调用有参构造
System.out.println(employee2.apply("zhangsan"));

4.Stream流

stream:对数据进行操作

特点:

stream本身不会存储数据 (只进行逻辑处理)

stream流不会修改源对象的数据,每次结果返回新的stream流

延迟加载:当发生终止行为时,才会执行一系列中间结果

流都是一次性流,不能重复使用多次,一旦使用完就销毁

流程:

创建stream流

一系列中间结果

终止行为

创建stream流

Collection->Stream
Arrays->stream
Stream.of()
        //并行流Stream<Integer> stream = List.of(1, 2, 3).parallelStream();Stream<Integer> stream5 = List.of(1, 2, 3).stream();String[] str = {"as","a","e","i","e"};Stream<String> stream1 = Arrays.stream(str);Stream<Integer> integerStream = Stream.of(1, 5, 6);

中间操作

过滤 filter 参数  断言型
去重 distinct()
截取  limit(long) 从第一个开始截取几个
跳过  skip(long) 跳过前n个
排序  sorted() --> 内部比较器sorted(Comparator) -->外部比较器
映射  map(Function) 参数是每一条数据,映射成一个新的结果返回,最后返回一个持有所以映射后的新的结果的流
stream1.filter((s)->!s.equals("a")).distinct().skip(1).limit(2).sorted().forEach(System.out::println);stream2.map((s)->{if (s.equals("e")){return 1;}else{return 0;}}).forEach(System.out::println);

终止操作

1)遍历 foreach(Consumer)
2)查找与匹配allMatch-检查是否匹配所有元素anyMatch-检查是否至少匹配一个元素noneMatch-检查是否没有匹配所有元素findFirst-返回第一个元素findAny-返回当前流中的任意元素count-返回流中元素的总个数max-返回流中最大值min-返回流中最小值
3)规约 reduce
map->reduce
加工->计算结果
4) 收集
collect()
        List<Employee> list = Arrays.asList(new Employee("bcd", 27, 9500),new Employee("aaa", 29, 10000),new Employee("abc", 28, 8000),new Employee("bc", 28, 9000),new Employee("bc", 28, 9000),new Employee("cde", 30, 12000));//判断每一个员工是否都>=20岁System.out.println(list.stream().distinct().allMatch((s) -> s.getSalary() >= 20));//查找薪资最低的员工//Optional<T>存储一个数据的容器类型->jdk8新增的容器类型-->帮助避免出现空指针异常System.out.println(list.stream().sorted((d1, d2) -> (int) (d1.getSalary() - d2.getSalary())).findFirst().get());//并行流System.out.println(list.stream().findAny().get());System.out.println(list.parallelStream().findAny().get());//规约//找到公司所有员工的薪资,求和System.out.println(list.stream().map(Employee::getSalary).reduce((d1, d2) -> (d1 + d2)).get());//收集collect  把最终的结果进行收集  统计//平均薪资System.out.println(list.stream().collect(Collectors.averagingDouble(Employee::getSalary)));//static <T> Collector<T,?,List<T>> toList() 返回 Collector ,将输入元素累积到新的 List 。System.out.println(list.stream().filter(e -> e.getAge() >= 28).collect(Collectors.toList()));//static <T> Collector<T,?,Set<T>> toSet() 返回 Collector ,将输入元素累积到新的 Set 。System.out.println(list.stream().filter(e -> e.getAge() >= 28).collect(Collectors.toSet()));//返回键值对//Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper) 返回 Collector ,它将元素累积到 Map其键和值是将提供的映射函数应用于输入元素的结果。//需要先去重Map<String, Double> collect = list.stream().distinct().collect(Collectors.toMap(Employee::getName, Employee::getSalary));System.out.println(collect);

Lambda与Stream流相关推荐

  1. java 8 stream_深度分析:java8的新特性lambda和stream流,看完你学会了吗?

    1. lambda表达式 1.1 什么是lambda 以java为例,可以对一个java变量赋一个值,比如int a = 1,而对于一个方法,一块代码也是赋予给一个变量的,对于这块代码,或者说被赋给变 ...

  2. 第四章 函数式编程(Lambda表达式Stream流)

    一.Lambda表达式 特点:是匿名函数 2是可传递 匿名函数:需要一个函数,但又不想命名一个函数的场景下使用lambda表达式,使用lambda表达式时函数内容应该简单 可传递:将lambda表达式 ...

  3. Lambda和Stream流

    目录 需要笔记的可以关注私聊,我发给你 Lambda 格式 排序 Stream流 获取流: .stream( ) 操作流(中间方法): 终结流: 收集流的操作 第一部分 第二部分 第三部分 Optio ...

  4. JDK1.8新特性之Lambda表达式+Stream流+函数式接口

    一.Lambda表达式 Lambda表达式,是JDK1.8引入的一种语法,这种语法可以对匿名内部类的写法,进行简写. 1.快速入门 package org.westos.demo2;import ja ...

  5. 16ava基础---Lambda,Stream流编程题

    命名要求:1. 类名,接口名,枚举名,注解名使用大驼峰2. 变量名,方法名,包名均使用小驼峰3. 常量名全大写,多个单词下划线分割4. 名字要见名知意,如果不知道对应的英文,可以使用拼音代替.不可使用 ...

  6. java基础复习——day18(Stream流 ; 反射)

    Stream流 1. 生成方式 Stream流 函数式编程 牛逼666 用到Lambda表达式 Stream流操作: stream流的使用 生成流 通过数据源(集合,数组等) 生成流list.stre ...

  7. java(九)-方法引用, Stream流,File类 , 递归 ,字节流

    day09[方法引用.Lambda表达式.Stream流] 今日目标 线程状态 等待与唤醒 Lambda表达式 Stream流 教学目标 能够说出线程6个状态的名称 能够理解等待唤醒案例 能够掌握La ...

  8. 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties

    文章目录 1.lambda表达式标准语法:()->{} 2.lambda表达式简略语法:可推导即可省略 3.lambda表达式原理:lambda效率比匿名内部类高 4.两个函数式接口:Consu ...

  9. 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>

    需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...

最新文章

  1. 乐变黄杲:当前如何选择App热更新服务
  2. mybatis.net mysql_ADO.NET与ORM的比较(5):MyBatis实现CRUD
  3. Java黑皮书课后题第7章:7.26(完全相同的数组)如果两个数组list1和list2的对应元素都相等,认为完全相同。编写一个测试程序,提示用户输入两个整数列表,然后显示这两个列表是否完全相同
  4. rxjs里concatMap operators的用法
  5. 中本聪研究所创始人对Core的发展方向感到厌恶
  6. 深度解读.NET 5授权中间件的执行策略
  7. Node.js从零开发Web Server博客项目笔记
  8. html溢出左右滚动,html-选项卡溢出时水平滚动
  9. python爬虫05--添加header
  10. 面向对象的理解及相关概念(封装,继承,多态)
  11. 阿里AI实验室负责人浅雪:从不淘宝购物的马云是天猫精灵用户
  12. EasyRecovery如何恢复虚拟建模软件的数据文件
  13. Promise改写获取萤石云摄像头直播地址的接口
  14. usb口拒绝访问_插u盘拒绝访问怎么办_win7u盘插电脑上显示拒绝访问的解决方法...
  15. 云计算基础设施的定义与介绍
  16. phpcms修改了配置文件之后出现Warning: date() expects parameter 2 to be long..错误
  17. Unity太空大战游戏-Socket网络通信教学示例
  18. 【Vue教程】01:入门前的概述:关于VUE那些事儿
  19. 30.kafka数据同步Elasticsearch深入详解(ES与Kafka同步)
  20. 简单之美——系统设计黄金法则

热门文章

  1. 两面夹定理_故事的两面
  2. 抛弃Visio,遇上效率作图工具Edraw亿图图示
  3. 大屏自适应文章收藏分享
  4. 树莓派diy小型计算机,自制树莓派电脑,让树莓派不再神秘
  5. App小程序 时间Note
  6. 关于使用硬盘对拷机后两硬盘UUID一样无法挂载问题
  7. 第九层(1):初识STL
  8. H3C服务器web怎么修改密码,h3c路由器怎么修改密码_h3c路由器找回密码
  9. SM4350 背光控制--关闭XBL WLED
  10. Hello World---kodu少儿编程第四天