java8 forEach、filter、map

2019-11-19 01:20:18

参考地址 java8 forEach、filter、map

1 forEach

forEach用于遍历元素。


1.1 准备数据

List<Employee>:


List<Employee> employeeList = new ArrayList<>();

employeeList.add(new Employee("Alice", 23, "London", 1200.00));

employeeList.add(new Employee("Bob", 19, "London", 2000.00));

employeeList.add(new Employee("Charles", 25, "New York", 1650.00));

employeeList.add(new Employee("Dorothy", 20, "Hong Kong", 1200.00));

1

2

3

4

5

Map<String, Employee>:


// key - name, value - Employee

Map<String, Employee> map1 = employeeList.stream()

                .collect(toMap(Employee::getName, Function.identity()));

1

2

3

Person:


public class Person {


    private String userName;

    private Integer age;


    public Person() {

    }


    public String getUserName() {

        return userName;

    }


    public void setUserName(String userName) {

        this.userName = userName;

    }


    public Integer getAge() {

        return age;

    }


    public void setAge(Integer age) {

        this.age = age;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

1.2 在List中使用forEach

例子:


(1)获取所有Employee的name


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

employeeList.forEach(employee -> names.add(employee.getName()));

1

2

1.3 在Map中使用forEach

例子:


(1)获取所有Employee的人员信息


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

map1.forEach((key, value) -> personInfos.add(key + "/" + value.getAge() + "/" + value.getCity()));

1

2

2 filter

filter用于过滤元素。


2.1 通过filter()过滤元素,通过collect() 收集元素

例子:


(1)筛选出住在London的Employee


List<Employee> afterFilter = employeeList.stream()

                .filter(employee -> "London".equals(employee.getCity()))

                .collect(toList());

1

2

3

2.2 filter()、findAny()、orElse()配合使用

filter()、findAny()、orElse()配合使用,可以根据条件获取某个元素,如果没有返回指定的值。


2.2.1 单条件

例子:


(1)找到名字为Alice的任何一个对象,如果不存在返回null


Employee alice = employeeList.stream()

                .filter(employee -> "Alice".equals(employee.getName()))

                .findAny()

                .orElse(null);

1

2

3

4

2.2.2 多条件

例子:


(1)根据city和age筛选对象


Employee result = employeeList.stream()

.filter(employee -> ("London".equals(employee.getCity()) && employee.getAge() < 20))

.findAny()

.orElse(null);

1

2

3

4

2.3 通过filter()过滤,通过map()转换

有时候经过筛选之后,我们想得到的可能不是对象本身,而是对象中的一个属性,可以通过map转换。


例子:


(1)找到名字为Alice的任何一个对象,返回它的属性,如果不存在返回""


String attribute = employeeList.stream()

.filter(employee -> "Alice".equals(employee.getName()))

.map(employee -> (employee.getName() + "/" + employee.getAge() + "/" + employee.getCity()))

.findAny()

.orElse("");

1

2

3

4

5

3 map

通过map可以将一种类型的对象转换成另一种类型的对象。


3.1 简单的同类型转换

(1)小写字母转换为大写字母


List<String> arrayBefore = Arrays.asList("a", "b", "c", "d");

List<String> arrayAfter = arrayBefore.stream()

.map(String::toUpperCase)

.collect(toList());

1

2

3

4

3.2 获取对象集合的某个属性集合

可以通过map提取对象集合的某个属性集合。


例子:


(1)获取List<Employee>中的name集合


List<String> nameList = employeeList.stream()

                .map(Employee::getName)

                .collect(toList());

1

2

3

3.3 一种类型的对象集合转换成另一种类型的对象集合

例子:


(1)将List<Employee> 转换为List<Person>


List<Person> personList = employeeList.stream()

                .map(employee -> {

                    Person person = new Person();

                    person.setName(employee.getName());

                    return person;

                })

                .collect(toList());

1

2

3

4

5

6

7



  • 2017-01-16 15:09:40

    Javascript模块化编程(一):模块的写法

    随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑。

  • 2017-01-16 15:16:24

    Javascript模块化编程(二):AMD规范

    AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

  • 2017-01-16 15:19:24

    RequireJS 入门指南

    如今最常用的JavaScript库之一是RequireJS。最近我参与的每个项目,都用到了RequireJS,或者是我向它们推荐了增加RequireJS。在这篇文章中,我将描述RequireJS是什么,以及它的一些基础场景。

  • 2017-01-16 15:22:30

    CommonJS规范

    CommonJS模块规范。 根据这个规范,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。

  • 2017-01-17 15:42:03

    vue-cli 发布(译)

    当我们真正开发一个应用的时候,我们不可避免的会用到一大堆的工具,模块化、预处理器、热模块加载、代码校验和测试。这些工具对于一个需要长期维护的大型应用是必须的,但是项目初始化将会是让人痛苦的事情。这就是为什么我们做了 vue-cli 。