Java8之Stream详解

Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。

一、流的初始化与转换

Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象:

1、初始化一个流

Stream stream = Stream.of("a", "b", "c");

2、数组转换为一个流

String [] strArray = new String[] {"a", "b", "c"};

stream = Stream.of(strArray);

或者

stream = Arrays.stream(strArray);

3、集合对象转换为一个流(Collections)

List<String> list = Arrays.asList(strArray);

stream = list.stream();

二、流的操作

流的操作可以归结为几种:

1、遍历操作(map)

使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合。

1.1、遍历转换为大写:

List<String> output = wordList.stream().

map(String::toUpperCase).

collect(Collectors.toList());

1.2、平方数:

List<Integer> nums = Arrays.asList(1, 2, 3, 4);

List<Integer> squareNums = nums.stream().

map(n -> n * n).

collect(Collectors.toList());

2、过滤操作(filter)

使用filter可以对象Stream中进行过滤,通过测试的元素将会留下来生成一个新的Stream。

得到其中不为空的String

List<String> filterLists = new ArrayList<>();

filterLists.add("");

filterLists.add("a");

filterLists.add("b");

List afterFilterLists = filterLists.stream()

.filter(s -> !s.isEmpty())

.collect(Collectors.toList());

3、循环操作(forEach)

如果只是想对流中的每个对象进行一些自定义的操作,可以使用forEach:

List<String> forEachLists = new ArrayList<>();

forEachLists.add("a");

forEachLists.add("b");

forEachLists.add("c");

forEachLists.stream().forEach(s-> System.out.println(s));

4、返回特定的结果集合(limit/skip)

limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素:

List<String> forEachLists = new ArrayList<>();

forEachLists.add("a");

forEachLists.add("b");

forEachLists.add("c");

forEachLists.add("d");

forEachLists.add("e");

forEachLists.add("f");

List<String> limitLists = forEachLists.stream().skip(2).limit(3).collect(Collectors.toList());

注意skip与limit是有顺序关系的,比如使用skip(2)会跳过集合的前两个,返回的为c、d、e、f,然后调用limit(3)会返回前3个,所以最后返回的c,d,e

5、排序(sort/min/max/distinct)

sort可以对集合中的所有元素进行排序。max,min可以寻找出流中最大或者最小的元素,而distinct可以寻找出不重复的元素:

5.1、对一个集合进行排序:

List<Integer> sortLists = new ArrayList<>();

sortLists.add(1);

sortLists.add(4);

sortLists.add(6);

sortLists.add(3);

sortLists.add(2);

List<Integer> afterSortLists = sortLists.stream().sorted((In1,In2)->

In1-In2).collect(Collectors.toList());

5.2、得到其中长度最大的元素:

List<String> maxLists = new ArrayList<>();

maxLists.add("a");

maxLists.add("b");

maxLists.add("c");

maxLists.add("d");

maxLists.add("e");

maxLists.add("f");

maxLists.add("hahaha");

int maxLength = maxLists.stream().mapToInt(s->s.length()).max().getAsInt();

System.out.println("字符串长度最长的长度为"+maxLength);

5.3、对一个集合进行查重:

List<String> distinctList = new ArrayList<>();

distinctList.add("a");

distinctList.add("a");

distinctList.add("c");

distinctList.add("d");

List<String> afterDistinctList = distinctList.stream().distinct().collect(Collectors.toList());

其中的distinct()方法能找出stream中元素equal(),即相同的元素,并将相同的去除,上述返回即为a,c,d。

6、匹配(Match方法)

有的时候,我们只需要判断集合中是否全部满足条件,或者判断集合中是否有满足条件的元素,这时候就可以使用match方法:

allMatch:Stream 中全部元素符合传入的 predicate,返回 true

anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true

noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

6.1、判断集合中没有有为‘c’的元素:

List<String> matchList = new ArrayList<>();

matchList.add("a");

matchList.add("a");

matchList.add("c");

matchList.add("d");

boolean isExits = matchList.stream().anyMatch(s -> s.equals("c"));

6.2、判断集合中是否全不为空:

List<String> matchList = new ArrayList<>();

matchList.add("a");

matchList.add("");

matchList.add("a");

matchList.add("c");

matchList.add("d");

boolean isNotEmpty = matchList.stream().noneMatch(s -> s.isEmpty());

则返回的为false

原文地址:https://www.cnblogs.com/Demrystv/p/9185388.html

时间: 2024-07-30 19:28:30

Java8之Stream详解的相关文章

Java8 Lambda表达式详解手册及实例

先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下Java8的新特性.Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了. 现在进入正题Java8的Lambda,首先看一下发音 ([?l?md?])表达式.注意该词的发音,b是不发音的,da发[d?]音. 为什么要引入Lambda表达式 简单的来说,引入La

TS Stream 详解

<什么是TS> TS(transport stream) , TS流文件,是一种DVD的文件格式,TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的,这种特性就决定了TS流文件主要用来实时传送的节目,比如实时广播的电视节目.与之相互对应的是PS(Program Stream),PS主要应用于存储的具有固定时长的节目,如DVD电影,将DVD上的VOB文件的前面一截剪掉(或者干脆就是数据损坏),那么就会导致整个文件无法解码. <TS码流数据封装格式> 网络上常见的TS码流结

爱你不容易 —— Stream详解

作为前端,我们常常会和 Stream 有着频繁的接触.比如使用 gulp 对项目进行构建的时候,我们会使用 gulp.src 接口将匹配到的文件转为 stream(流)的形式,再通过 .pipe() 接口对其进行链式加工处理: 或者比如我们通过 http 模块创建一个 HTTP 服务: const http = require('http'); http.createServer( (req, res) => { //... }).listen(3000); 此处的 req 和 res 也属于

[二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type used to indicate that an interface * type declaration is intended to be a <i>functional interface</i> as * defined by the Java Language Specificat

java10 新特性 详解

引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为null,因为不能判断具体类型,会报异常. @Test public void test1(){ var number = 10; var str = "i like java"; var list = new ArrayList<>(); var map = new Hash

Java8初体验(二)Stream语法详解

原文链接:http://ifeve.com/stream/ 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的

JAVA8之lambda表达式详解,及stream中的lambda使用

原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗? 二.概念 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算

【转】Java8初体验(二)Stream语法详解

原文链接 http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 [email protected]上篇文章Java8初体验(一)lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Str

Atitit.jdk&#160;java8的语法特性详解&#160;attilax&#160;总结

Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不是客户代码.例如:1 2.2. Stream 流失接口 管道(pipelines)模式2 2.3. 方法引用(Method reference)2 2.4.  默认方法(Default method)2 2.5. 生成器函数(Generator function)2 2.6. 新加入的Nashorn