java8 filter return_java8新特性Java 8 Streams filter示例 - Java教程
在这篇教程中我将向你展示 filter(), collect(), findAny() 和 orElse() 的用法
1. Streams filter() 和 collect()
1.1 在 Java 8 以前, 像下面这样过滤一个 List:
BeforeJava8.java
package com.mkyong.java8;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class BeforeJava8 {
public static void main(String[] args) {
List lines = Arrays.asList("spring", "node", "mkyong");
List result = getFilterOutput(lines, "mkyong");
for (String temp : result) {
System.out.println(temp); //output : spring, node
}
}
private static List getFilterOutput(List lines, String filter) {
List result = new ArrayList<>();
for (String line : lines) {
if (!"mkyong".equals(line)) { // we dont like mkyong
result.add(line);
}
}
return result;
}
}
Output
spring
node
1.2 Java 8里面的等价写法: 使用collect()将一个List转化为steam(流),然后使用stream.filter() 来过滤它.
NowJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class NowJava8 {
public static void main(String[] args) {
List lines = Arrays.asList("spring", "node", "mkyong");
List result = lines.stream() // 转化为一个流
.filter(line -> !"mkyong".equals(line)) // 排除 'mkyong'
.collect(Collectors.toList()); // 吧输出流收集回List中
result.forEach(System.out::println); //输出 : spring, node
}
}
Output
spring
node
2. Streams filter(), findAny() 和 orElse()
Person.java
package com.mkyong.java8;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//gettersm setters, toString
}
2.1 在Java 8以前, 你想通过name获取一个Person通常像这样 :
BeforeJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
public class BeforeJava8 {
public static void main(String[] args) {
List persons = Arrays.asList(
new Person("mkyong", 30),
new Person("jack", 20),
new Person("lawrence", 40)
);
Person result = getStudentByName(persons, "jack");
System.out.println(result);
}
private static Person getStudentByName(List persons, String name) {
Person result = null;
for (Person temp : persons) {
if (name.equals(temp.getName())) {
result = temp;
}
}
return result;
}
}
Output
Person{name='jack', age=20}
2.2 在Java 8里面的等价操作是使用 stream.filter()来过滤 List,使用 .findAny().orElse (null) 来返回指定的对象.
NowJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
public class NowJava8 {
public static void main(String[] args) {
List persons = Arrays.asList(
new Person("mkyong", 30),
new Person("jack", 20),
new Person("lawrence", 40)
);
Person result1 = persons.stream() // 转化为流
.filter(x -> "jack".equals(x.getName())) // 只过滤出"jack"
.findAny() // 如果找到了就返回
.orElse(null); // 如果找不到就返回null
System.out.println(result1);
Person result2 = persons.stream()
.filter(x -> "ahmook".equals(x.getName()))
.findAny()
.orElse(null);
System.out.println(result2);
}
}
Output
Person{name='jack', age=20}
null
2.3 多重条件指定.
NowJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
public class NowJava8 {
public static void main(String[] args) {
List persons = Arrays.asList(
new Person("mkyong", 30),
new Person("jack", 20),
new Person("lawrence", 40)
);
Person result1 = persons.stream()
.filter((p) -> "jack".equals(p.getName()) && 20 == p.getAge())
.findAny()
.orElse(null);
System.out.println("result 1 :" + result1);
//or like this
Person result2 = persons.stream()
.filter(p -> {
if ("jack".equals(p.getName()) && 20 == p.getAge()) {
return true;
}
return false;
}).findAny()
.orElse(null);
System.out.println("result 2 :" + result2);
}
}
Output
result 1 :Person{name='jack', age=20}
result 2 :Person{name='jack', age=20}
3. Streams filter() 和 map()
NowJava8.java
package com.mkyong.java8;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class NowJava8 {
public static void main(String[] args) {
List persons = Arrays.asList(
new Person("mkyong", 30),
new Person("jack", 20),
new Person("lawrence", 40)
);
String name = persons.stream()
.filter(x -> "jack".equals(x.getName()))
.map(Person::getName) //吧流转化为String
.findAny()
.orElse("");
System.out.println("name : " + name);
List collect = persons.stream()
.map(Person::getName)
.collect(Collectors.toList());
collect.forEach(System.out::println);
}
}
Output
name : jack
mkyong
jack
lawrence
注意
Highly recommend this Streams tutorial – Processing Data with Java SE 8 Streams
References
java8 filter return_java8新特性Java 8 Streams filter示例 - Java教程相关推荐
- Java基础笔记-Java8及其他新特性
第十六章 Java8及其他新特性 16.1 Java8新特性简介 16.2 lambda表达式和函数式接口 16.3 方法引用与构造器引用 16.4 StreamAPI的使用 16.5 Optiona ...
- Java基础学习总结(33)——Java8 十大新特性详解
Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...
- Java8的一些新特性
Java8的一些新特性 文章目录 Java8的一些新特性 1.函数式接口 2.Lambda表达式 2.1.介绍 2.2.案例 2.3.案例讲解 3.方法引用 3.1.介绍 3.2.案例 4.Strea ...
- JAVA8 十大新特性详解
JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm java7和java6比较有什么不同 转载于:https://www.cnblogs.com/y ...
- 一、了解java虚拟机历史发展、及java8带来的新特性
1.Jdk8的新特性: 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方法与静态方法 4.方法引用,与Lambda表达式联合使用 ...
- java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程
在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序. 1. Group By, Count and Sort 1.1 对 ...
- JAVA8 十大新特性
一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 复制代码代码如下: interface Formula ...
- Java8的其它 新特性(笔记二十四)
标题 Java 8新特性简介 一.Lambda表达式 1.为什么使用Lambda表达式 2.使用举例 二.函数式(Functional)接口 1.什么是函数式(Functional)接口 2.如何理解 ...
- Servlet3.0新特性WebFilter(Annotation Filter)详解
摘要: Servlet3.0作为J2EE 6规范一部分,并随J2EE6一起发布,WeFilter是过滤器注解,是Servlet3.0的新特性,不需要在web.xml进行配置,简化了配置. Name T ...
最新文章
- NOSQL图形数据库 - Neo4j
- (转) GPG入门教程
- 【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )
- 爬虫实战:使用Selenium爬取京东宝贝信息
- VTK:Filtering之WarpTo
- quartus将modelsim,synplify和quartus联合起来使用进行的FPGA设计(转)
- 不吃不喝,两周业余时间研究(cisco SCE CM )
- 工作382-vant弹框不能直接用
- spark计算操作整理
- 事务相关命令 mysql
- javascript 西瓜一期 12 八进制的数数进位解析
- springboot链接数据库的bug
- .net remoting的事务传播以及wcf分布式事务
- [数据结构]P2.1 二叉搜索树
- C++ 单元测试框架 Boost Test BOOST_AUTO_TEST_CASE
- Android获取视频文件时长
- Android10修改电池图标,导航栏、信号及电池图标修改方法(新增视频教程)
- maya中实时置换效果 dx11shader
- springboot easypoi excel导出功能
- 解决有道云笔记中Markdown语法中代码块字体太小的问题
热门文章
- 【渝粤教育】电大中专职业应用写作_1作业 题库
- MATLAB追加向量
- 【自适应(盲)均衡1】LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真
- 第十二届蓝桥杯A组省赛填空题Java思路及代码合集(相乘直线货物摆放路径回路计数)
- html图片显示原始大小,我如何使PHP / HTML图像在单击时显示原始大小?
- linux-shell-命令总结
- 【终结版】C#常用函数和方法集汇总
- IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新
- MFC程序打开文件对话框出错的问题解决
- Block(Closure) Tips