在这篇教程中我将向你展示 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教程相关推荐

  1. Java基础笔记-Java8及其他新特性

    第十六章 Java8及其他新特性 16.1 Java8新特性简介 16.2 lambda表达式和函数式接口 16.3 方法引用与构造器引用 16.4 StreamAPI的使用 16.5 Optiona ...

  2. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  3. Java8的一些新特性

    Java8的一些新特性 文章目录 Java8的一些新特性 1.函数式接口 2.Lambda表达式 2.1.介绍 2.2.案例 2.3.案例讲解 3.方法引用 3.1.介绍 3.2.案例 4.Strea ...

  4. JAVA8 十大新特性详解

    JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm java7和java6比较有什么不同 转载于:https://www.cnblogs.com/y ...

  5. 一、了解java虚拟机历史发展、及java8带来的新特性

    1.Jdk8的新特性:     1.Lambda表达式     2.Stream函数式操作流元素集合     3.接口新增:默认方法与静态方法     4.方法引用,与Lambda表达式联合使用    ...

  6. java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程

    在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序. 1. Group By, Count and Sort 1.1 对 ...

  7. JAVA8 十大新特性

    一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 复制代码代码如下: interface Formula ...

  8. Java8的其它 新特性(笔记二十四)

    标题 Java 8新特性简介 一.Lambda表达式 1.为什么使用Lambda表达式 2.使用举例 二.函数式(Functional)接口 1.什么是函数式(Functional)接口 2.如何理解 ...

  9. Servlet3.0新特性WebFilter(Annotation Filter)详解

    摘要: Servlet3.0作为J2EE 6规范一部分,并随J2EE6一起发布,WeFilter是过滤器注解,是Servlet3.0的新特性,不需要在web.xml进行配置,简化了配置. Name T ...

最新文章

  1. NOSQL图形数据库 - Neo4j
  2. (转) GPG入门教程
  3. 【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )
  4. 爬虫实战:使用Selenium爬取京东宝贝信息
  5. VTK:Filtering之WarpTo
  6. quartus将modelsim,synplify和quartus联合起来使用进行的FPGA设计(转)
  7. 不吃不喝,两周业余时间研究(cisco SCE CM )
  8. 工作382-vant弹框不能直接用
  9. spark计算操作整理
  10. 事务相关命令 mysql
  11. javascript 西瓜一期 12 八进制的数数进位解析
  12. springboot链接数据库的bug
  13. .net remoting的事务传播以及wcf分布式事务
  14. [数据结构]P2.1 二叉搜索树
  15. C++ 单元测试框架 Boost Test BOOST_AUTO_TEST_CASE
  16. Android获取视频文件时长
  17. Android10修改电池图标,导航栏、信号及电池图标修改方法(新增视频教程)
  18. maya中实时置换效果 dx11shader
  19. springboot easypoi excel导出功能
  20. 解决有道云笔记中Markdown语法中代码块字体太小的问题

热门文章

  1. 【渝粤教育】电大中专职业应用写作_1作业 题库
  2. MATLAB追加向量
  3. 【自适应(盲)均衡1】LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真
  4. 第十二届蓝桥杯A组省赛填空题Java思路及代码合集(相乘直线货物摆放路径回路计数)
  5. html图片显示原始大小,我如何使PHP / HTML图像在单击时显示原始大小?
  6. linux-shell-命令总结
  7. 【终结版】C#常用函数和方法集汇总
  8. IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新
  9. MFC程序打开文件对话框出错的问题解决
  10. Block(Closure) Tips