1.forEach(遍历)

List<String> strings = Arrays.asList("123", "", "ac", "bgd", "tyu","", "dd",null);
//遍历所有项
strings.stream().forEach(s -> System.out.println(s));

2.map/flatMap(映射到对应的结果)

List<Integer> numbers = Arrays.asList(4, 3, 2, 3, 5, 6, 5);
// 获取对应的平方数
System.out.println("numbers = " + numbers.stream().map(i -> i*i).collect(Collectors.toList()));
//将两个集合合并成一个集合
List<String> list = Arrays.asList("h,jj,t,ab", "1,2,3,4");
List<String> listNew = list.stream().flatMap(s -> {// 将每个元素转换成一个streamString[] split = s.split(",");Stream<String> s2 = Arrays.stream(split);return s2;}).collect(Collectors.toList());System.out.println("处理前的集合:" + list);
System.out.println("处理后的集合:" + listNew);

3.filter(过滤)

List<String> strings = Arrays.asList("123", "", "ac", "bgd", "tyu","","1234", "dd",null);
//过滤字符串不为空的并收集为集合
System.out.println(strings.stream().filter(s -> StringUtils.isNotBlank(s)).collect(Collectors.toList()));
//匹配第一个值
System.out.println("匹配第一个值:"+strings.stream().filter(s -> StringUtils.contains(s,"d")).findFirst().get());
//匹配任意一个 并行比较快
System.out.println("匹配任意一个值:" + strings.parallelStream().filter(s -> StringUtils.contains(s, "123")).findAny().get());
//字符串数据中是否存在 "tyu" 字符串
System.out.println("是否存在 'tyu' 字符串"+strings.stream().anyMatch( s -> StringUtils.contains(s,"tyu")));

4.limit(分页)

List<String> strings = Arrays.asList("123", "32", "ac", "bgd", "tyu","", "dd",null);
//取两条记录并收集为数组
System.out.println(strings.stream().limit(2).collect(Collectors.toList()));

5.sorted(排序)

List<Integer> numbers = Arrays.asList(4, 3, 2, 3, 5, 6, 5);
//默认排序升序
System.out.println(numbers.stream().sorted().collect(Collectors.toList()));
//降序
System.out.println(numbers.stream().sorted((x,y) -> y-x).collect(Collectors.toList()));
System.out.println(numbers.stream().sorted(Comparator.reverseOrder())
.collect(Collectors.toList()));//排序前输出
StudentInfo.printStudents(studentList);
//按年龄排序(Integer类型)
List<StudentInfo> studentsSortName = studentList.stream().sorted(Comparator
.comparing(StudentInfo::getAge).reversed().thenComparing(StudentInfo::getHeight)).collect(Collectors.toList());
//排序后输出
StudentInfo.printStudents(studentsSortName);

6.distinct(去重)

List<Integer> numbers = Arrays.asList(4, 3, 2, 3, 5, 6, 5);
//去重(注意:对象慎用,可能不会去重)
System.out.println(numbers.stream().distinct().collect(Collectors.toList()));

7.reduce(规约(缩减):流缩减一个值,实现求和、求积、求最值)

List<Integer> list = Arrays.asList(1, 3, 2, 8, 5, 4);
// 求和方式1
Optional<Integer> sum = list.stream().reduce((x, y) -> x + y);
// 求和方式2
Optional<Integer> sum2 = list.stream().reduce(Integer::sum);
// 求和方式3
Integer sum3 = list.stream().reduce(0, Integer::sum);// 求乘积
Optional<Integer> product = list.stream().reduce((x, y) -> x * y);// 求最大值方式1
Optional<Integer> max = list.stream().reduce((x, y) -> x > y ? x : y);// 求最大值写法2
Integer max2 = list.stream().reduce(1, Integer::max);// 求最大值写法3
Integer max3 = list.stream().max(Comparator.comparing(s -> s)).get();System.out.println("list求和:" + sum.get() + "," + sum2.get() + "," + sum3);
System.out.println("list求积:" + product.get());
System.out.println("list求和:" + max.get() + "," + max2);
System.out.println("list求和:" + max3);

8.groupingBy(分组)及max(最大)

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
static
class User {private long id;private String name;
}User user1 = new User(1, "123");
User user2 = new User(2, "456");
User user3 = new User(1, "789");
User user4 = new User(3, "000");
ArrayList<User> users = Lists.newArrayList(user1, user2, user3,user4);
//根据id分组  结果{1=[ApiCompanyInfoController.User(id=1, name=123), ApiCompanyInfoController.User(id=1, name=789)], 2=[ApiCompanyInfoController.User(id=2, name=456)]}
System.out.println(users.stream().filter(u -> 3 != u.getId()).collect(Collectors.groupingBy(User::getId)));//分组统计  结果{1=2, 2=1}
System.out.println(users.stream().filter(u -> 3 != u.getId()).collect(Collectors.groupingBy(User::getId,Collectors.counting())));//找到id最大的对象  结果User(id=3, name=000)
System.out.println(users.stream().max(Comparator.comparing(User::getId)).get());

9.findFirst(返回第一个)

List<String> list = Arrays.asList("A", "B", "F", "A", "C");
// 返回 A
list.stream().findFirst().ifPresent(System.out::println);

10.anyMatch(检查流是否包含至少一个满足给定谓词的元素

Stream<String> stream = Stream.of("A", "B", "C", "D");
boolean match = stream.anyMatch(s -> s.contains("C"));
// 返回 true
System.out.println(match);

11.allMatch(检查流是否所有都满足给定谓词的元素

Stream<String> stream = Stream.of("A", "B", "C", "D");
boolean match = stream.allMatch(s -> s.contains("C"));
// 返回 false
System.out.println(match);

12.peek(打印个日志)

List<String> result = Stream.of("程序员baoli", "baoli小男孩", "捡瓶子的小男孩").filter(a -> a.contains("baoli")).peek(a -> System.out.println("tag:" + a)).collect(Collectors.toList());
// tag:程序员baoli
// tag:baoli小男孩
// [程序员baoli, baoli小男孩]
System.out.println(result);

13.常用函数式接口

其实lambda离不开函数式接口,我们来看下JDK8常用的几个函数式接口:

  • Function<T, R>(转换型): 接受一个输入参数,返回一个结果

  • Consumer<T> (消费型): 接收一个输入参数,并且无返回操作

  • Predicate<T> (判断型): 接收一个输入参数,并且返回布尔值结果

  • Supplier<T> (供给型): 无参数,返回结果

Function<T, R> 是一个功能转换型的接口,可以把将一种类型的数据转化为另外一种类型的数据

//获取每个字符串的长度,并且返回
Function<String, Integer> function = String::length;
Stream<String> stream = Stream.of("程序员baoli", "baoli小男孩", "捡瓶子的小男孩");
Stream<Integer> resultStream = stream.map(function);
resultStream.forEach(System.out::println);

Consumer<T>是一个消费性接口,通过传入参数,并且无返回的操作

Consumer<String> comsumer = System.out::println;
Stream<String> stream = Stream.of("程序员baoli", "baoli小男孩", "捡瓶子的小男孩");
stream.forEach(comsumer);

Predicate<T>是一个判断型接口,并且返回布尔值结果

Predicate<Integer> predicate = a -> a > 18;
User user = new User(2, "程序员baoli", 27);
System.out.println(predicate.test(userInfo.getAge()));

Supplier<T>是一个供给型接口,无参数,有返回结果

Supplier<Integer> supplier = () -> Integer.valueOf("666");
System.out.println(supplier.get());

希望能帮你到,点赞留名,内容不断的更新,敬请期待哦

Java8 Stream 常用简书相关推荐

  1. java8 steam常用操作

    java8 stream常用操作 遍历 list.stream().forEach(System.out::println); 获取实体list某个字段集合 list.stream().map(e - ...

  2. python对excel操作简书_Python实现EXCEL常用操作——pandas简介

    知乎的代码块太丑了,这里的内容就更新到简书了Python实现EXCEL常用操作--pandas简介​www.jianshu.com EXCEL是日常办公最常用的软件,然而遇到数据量特别大(超过10W条 ...

  3. 简洁又快速地处理集合——Java8 Stream(下)

    上一篇文章我讲解 Stream 流的基本原理,以及它与集合的区别关系,讲了那么多抽象的,本篇文章我们开始实战,讲解流的各个方法以及各种操作 没有看过上篇文章的可以先点击进去学习一下 简洁又快速地处理集 ...

  4. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  5. java8 stream().map().collect()用法

    java8 stream().map().collect()用法 有一个集合: List<User> users = getList(); //从数据库查询的用户集合 现在想获取User的 ...

  6. Java8 Stream流操作在用户系统中的妙用

    在做目前这个项目的时候,发现以前有一个筛选的需求,老程序员是这么做的,先请求Http服务器得到一长串json数据,大概用A4纸打了40多页那么多,然后将这些对象写入到sqlite数据库中,再用数据库查 ...

  7. java8 stream原理

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  8. 爬虫与浏览器的区别,爬虫产生(出自简书)

    一篇文章了解爬虫技术现状 - 简书 https://www.jianshu.com/p/fbdad6f77d0c 需求 万维网上有着无数的网页,包含着海量的信息,无孔不入.森罗万象.但很多时候,无论出 ...

  9. java8函数式编程 视频_快速掌握Java8 Stream函数式编程技巧

    函数式编程优势"函数第一位",即函数可以出现在任何地方. 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值. 让代码的逻辑更清晰更优雅. 减少了可变量(Immutable ...

最新文章

  1. 【Android】AsyncTask异步类
  2. 为什么“我”只给iOS做了应用?
  3. 前端为什么要使用组件化的思想,通过一个实例来分析
  4. 信安教程第二版-第24章工控安全需求分析与安全保护工程
  5. Linux磁盘分区详解(parted)
  6. python open file mode description
  7. ======第二章进程管理======
  8. 9000多篇投稿,接收率只有15%,今年的AAAI你中了吗?
  9. Java 加密扩展(JCE)框架 之 Cipher 加密与解密
  10. JAVA酒店管理系统
  11. Python做一个简单的在线编辑器
  12. 图像处理:图像二值化原理
  13. 已有的MGR集群上配置InnoDB Cluster
  14. 向量乘向量的转置的平方_MIT线性代数笔记1.5(转置,置换,向量空间)
  15. 大数据是什么?华为云学院带你探索大数据之旅
  16. 参考文献标引方式_参考文献的正确标注方法
  17. 微软计算机电源怎么接,电源线,详细教您电脑电源线怎么接
  18. RabbitMQ的分发机制
  19. 数值计算大作业:非线性方程求根(二分法、牛顿法、弦截法在Matlab实现)
  20. 使用YOLOv5实现多路摄像头实时目标检测

热门文章

  1. 管道中的19个事件.
  2. 镭神智能激光雷达产品手册v4.2_镭神智能胡小波:激光雷达作为一种前沿产品,须具备前瞻性眼光...
  3. 电商首页、支付功能测试要点
  4. CSS3 Box Shadow
  5. 数学建模常用模型及代码
  6. (转载)Oracle的结构体系的抽象
  7. nested exception is java.lang.IncompatibleClassChangeError: Implementing class(已解决)
  8. C 语言程序员的“十诫”!
  9. 三种价差交易,你知道几个?
  10. YDOOK: ANSYS Maxwell 19 教程7:Maxwell 2D 材料管理 添加新增 永磁材料