写在前面

本文为笔者学习的一些心得,如有问题,评论请轻喷

本文分为以下部分:

中间操作

终止操作

归纳

中间操作

对 list 进行操作,返回一个新的 list

主要函数 作用
filter 过滤操作
limit 截取限制个数的 list
skip 对 list 进行跳过操作
distinct 去重操作
map 提取 list 中的每个元素进行操作,改变原元素
flatMap 将多个流放在一个流上,然后再组合
sorted 对 list 进行排序操作,可以定制排序
concat 拼接,将两个list拼接到一个list上

筛选

filter

filter 对 list 中的数据进行过滤操作

List<Integer> list = Arrays.asList(1, 2, 2, 3);
List<Integer> integers = list.stream().filter(i -> i > 1).collect(Collectors.toList());
System.out.println(integers); [2, 2, 3]

limit

limit 对 list 进行限制个数操作

List<Integer> list = Arrays.asList(1, 2, 2, 3);
list.stream().limit(2).forEach(System.out::println);
List<Integer> integers = list.stream().limit(2).map(i -> i * 3).collect(Collectors.toList());
System.out.println(integers); 1
2
[3, 6]

skip

skip 对 list 进行跳过操作

List<Integer> list = Arrays.asList(1, 2, 2, 3);
List<Integer> integers = list.stream().skip(2).collect(Collectors.toList());
System.out.println(integers); [2, 3]

distinct

distinct 去重

List<Integer> list = Arrays.asList(1, 2, 2, 3);
List<Integer> integers = list.stream().distinct().collect(Collectors.toList());
System.out.println(integers); [1, 2, 3]

映射

map

map 对 list 中的每个数进行操作

List<Integer> list = Arrays.asList(1, 2, 2, 3);
List<Integer> integers = list.stream().map(i -> i * i).collect(Collectors.toList());
System.out.println(integers); [1, 4, 4, 9]

flatMap

flatMap 将多个流(一般为多维)放在一个流上,然后再组合(可以看成 降维

Integer[][] ary = {{1,2,3,4,5},{6,7,8,9,10}};
List<Integer> integers = Arrays.stream(ary).flatMap(i -> Arrays.stream(i)).collect(Collectors.toList());
System.out.println(integers); [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

排序

sorted

sort 对 list 进行排序操作,可以定制排序

//正序排序
List<Integer> list = Arrays.asList(5,4,3,2,1);
List<Integer> integers = list.stream().sorted().collect(Collectors.toList());
System.out.println(integers); [1, 2, 3, 4, 5] //倒序排序
List<Integer> integers1 = integers.stream().sorted(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
}).collect(Collectors.toList());
System.out.println(integers1); [5, 4, 3, 2, 1]

拼接

concat

concat,拼接,将两个list拼接到一个list上

List<String> list1 = Arrays.asList("1", "2");
List<String> list2 = Arrays.asList("3", "4");
List<String> list3 = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());
System.out.println(list3); [1, 2, 3, 4]

终止操作

无法返回新 list

主要函数 作用
allMatch 检查是否所有值都匹配
anyMatch 检查是否至少匹配一个元素
noneMatch 检查是否没有一项匹配
findFirst 查找第一个元素
count 计算总数
max、min 取出最大、最小值(可自定义)
forEach 迭代 list 中的每个数,和map不同,无法对原元素进行操作

allMatch

allMatch 检查是否所有值都匹配,返回boolean类型

List<Integer> list = Arrays.asList(1, 2, 2, 3);
System.out.println(list.stream().allMatch(x -> x < 2)); false

anyMatch

anyMatch 检查是否至少匹配一个元素,返回boolean类型

List<Integer> list = Arrays.asList(1, 2, 2, 3);
System.out.println(list.stream().anyMatch(x -> x < 2)); true

noneMatch

noneMatch 检查是否没有一项匹配,返回boolean类型

List<Integer> list = Arrays.asList(1, 2, 2, 3);
System.out.println(list.stream().noneMatch(x -> x < 2)); false

findFirst

findFirst 查找第一个

List<Integer> list = Arrays.asList(1, 2, 2, 3);
Optional<Integer> first = list.stream().findFirst();
System.out.println(first.get()); 1

count

count 计算总共有多少个元素,配合其他操作(多为中间操作)使用

List<Integer> list = Arrays.asList(1, 2, 2, 3);
System.out.println(list.stream().count()); 4

max、min

max 查找 list 中的最大值,可以自定义何为最大值;

min 查找 list 中的最小值,可以自定义何为最小值;

List<Integer> list = Arrays.asList(1, 2, 2, 3);
Optional<Integer> max = list.stream().max(Integer::compareTo);
System.out.println(max.get()); 3 Optional<Integer> min = list.stream().min(Integer::compareTo);
System.out.println(min.get()); 1

forEach

forEach 迭代 list 中的每个数

List<Integer> list = Arrays.asList(1, 2, 2, 3);
list.stream().forEach(System.out::println); 1
2
2
3

归纳

reduce

reduce(BinaryOperator<P_OUT> accumulator) 类似赫夫曼树的生成规则

首先取出前俩元素进行操作,删除前俩元素,再把得出的值压回 list 头部,上面步骤重复

List<Integer> list = Arrays.asList(1, 2, 2, 3);
Optional<Integer> reduce = list.stream().reduce((o1, o2) -> o1 + o2);
// ==>
Optional<Integer> reduce1 = list.stream().reduce((o1, o2) -> {
System.out.print("o1:" + o1);
System.out.print(" o2:" + o2);
int i = o1 + o2;
System.out.print(" sum:" + i);
System.out.println();
return i;
});
System.out.println(reduce.get());
System.out.println(reduce1.get()); o1:1 o2:2 sum:3
o1:3 o2:2 sum:5
o1:5 o2:3 sum:8
8
8

reduce(final P_OUT identity, final BinaryOperator<P_OUT> accumulator) 带有初始值,与上方逻辑一致

List<Integer> list = Arrays.asList(1, 2, 2, 3);
Integer reduce = list.stream().reduce(100, (o1, o2) -> o1 + o2);
// ==>
Integer reduce1 = list.stream().reduce(100, (o1, o2) -> {
System.out.print("o1:" + o1);
System.out.print(" o2:" + o2);
int i = o1 + o2;
System.out.print(" sum:" + i);
System.out.println();
return i;
});
System.out.println(reduce);
System.out.println(reduce1); o1:100 o2:1 sum:101
o1:101 o2:2 sum:103
o1:103 o2:2 sum:105
o1:105 o2:3 sum:108
108
108

reduce(R identity, BiFunction<R, ? super P_OUT, R> accumulator, BinaryOperator combiner)

将第一个数组经过一系列操作复制到另一个list

List<Integer> list = Arrays.asList(1, 2, 2, 3);
ArrayList<Integer> newList = new ArrayList<>();
ArrayList<Integer> integers = Stream.of(list.toArray()).reduce(newList, (o1, o2) -> {
System.out.print("o1:"+o1);
System.out.print(" o2:"+o2);
System.out.println();
o1.add((Integer)o2);
return o1;
}, (o1, o2) -> null);
System.out.println(integers);
System.out.println(newList); o1:[] o2:1
o1:[1] o2:2
o1:[1, 2] o2:2
o1:[1, 2, 2] o2:3
[1, 2, 2, 3]
[1, 2, 2, 3]

java stream 简单函数的更多相关文章

  1. Java Stream 使用详解

    Stream是 Java 8新增加的类,用来补充集合类. Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的. Stream和其它集合类的区别在于:其它集合类主要关注与有限数量的 ...

  2. Java Stream API性能测试

    已经对Stream API的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?本节我们对Stream API的性能一探究竟. 为保证测试结果真实可信,我们将JVM运行在-ser ...

  3. java stream 原理

    java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字,然后从中选 ...

  4. Java – Stream has already been operated upon or closed

    Java – Stream has already been operated upon or closed package com.mkyong.java8; import java.util.Ar ...

  5. java stream collector

    Java Stream API进阶篇 本文github地址 上一节介绍了部分Stream常见接口方法,理解起来并不困难,但Stream的用法不止于此,本节我们将仍然以Stream为例,介绍流的规约操作 ...

  6. Java Stream简介, 流的基本概念

    在Javaor .net编程中,  我们经常见到"stream" 这个字眼. 我们大概知道这是个流的意思, 如果看完本文的话, 应该会有1个大概的概念. 一, Java中什么是St ...

  7. Java-Runoob:Java Stream、File、IO

    ylbtech-Java-Runoob:Java Stream.File.IO 1.返回顶部 1. Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出 ...

  8. Java Stream函数式编程案例图文详解

    导读 作者计划把Java Stream写成一个系列的文章,本文只是其中一节.更多内容期待您关注我的号! 一.什么是Java Stream? Java Stream函数式编程接口最初是在Java 8中引 ...

  9. Java Stream函数式编程图文详解(二):管道数据处理

    一.Java Stream管道数据处理操作 在本号之前发布的文章<Java Stream函数式编程?用过都说好,案例图文详解送给你>中,笔者对Java Stream的介绍以及简单的使用方法 ...

  10. Java Stream函数式编程第三篇:管道流结果处理

    一.Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API.在使用的过程中分为三个阶段.在开始本文之前 ...

随机推荐

  1. 【我与openGauss的故事】如何管理数据库安全(第一部分)

    前言 2021 年 6 月 10 日国家颁布数据安全法对我们国家来说具有重大意义 信息安全法 梳理几点重要意义: (一) 对数据的有效监管实现了有法可依,填补了数据安全保护立法的空白,完善了网络空间安 ...

  2. C#的AOP(最经典实现)

    (适用于.NET/.NET Core/.NET Framework) [目录]0.前言1.第一个AOP程序2.Aspect横切面编程3.一个横切面程序拦截多个主程序4.多个横切面程序拦截一个主程序5. ...

  3. 《深入理解Java虚拟机》读书笔记:HotSpot的算法实现

    HotSpot的算法实现 HotSpot的算法实现概要 1.枚举根节点 由于目前的主流Java虚拟机使用的都是准确式GC(这个概念在第1章介绍Exact VM对Classic VM的改进时讲过),所以 ...

  4. Python scipy.ndimage.find_objects用法及代码示例

    用法 scipy.ndimage.find_objects(input, max_label=0) 在标记数组中查找对象. 参数: input: 整数数组 包含由不同标签定义的对象的数组.值为 0 的 ...

  5. MongoDB命令行交互

    命令行交互 命令行交互一般是学习数据库的第一步,不过这些命令在后续用的比较少,了解即可. 角色命令 创建角色 use admin db.createUser({"user": &q ...

  6. 美团二面:如何保证Redis与Mysql双写一致性?连续两个面试问到了!

    引言 Redis作为一款高效的内存数据存储系统,凭借其优异的读写性能和丰富的数据结构支持,被广泛应用于缓存层以提升整个系统的响应速度和吞吐量.尤其是在与关系型数据库(如MySQL.PostgreSQL ...

  7. Taurus.MVC 性能压力测试(ap 压测 和 linux 下wrk 压测):.NET 版本

    前言: 上次发布了:Taurus.MVC 性能压力测试(ap 压测 和 linux 下wrk 压测):.NET Core 版本 今天计划准备压测一下 .NET 版本,来测试并记录一下 Taurus.M ...

  8. @SpringBootConfiguration注解

    @SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到sprin ...

  9. etcd 历史版本回溯的方法

    在使用 etcd 作为配置存储或者其他的场景,如果因为误操作对其中 key 的值进行了修改,如果想要找回原来的值,可以利用 etcd 的版本机制进行回溯找回以前的值.在具体操作之前,我们首先获取一下 ...

  10. Advanced .Net Debugging 7:托管堆与垃圾收集

    一.简介 这是我的<Advanced .Net Debugging>这个系列的第七篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第五章,这一章主要讲的是从根本上认识托管堆和垃圾回收 ...