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



  • 2019-09-26 19:03:33

    spring post jackson的反序列化需要无参构造函数

    JSON parse error: Cannot construct instance of `com.**` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.**` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)  at [Source: (PushbackInputStream); line: 2, column: 2]] ———————————————— 版权声明:本文为CSDN博主「冰夏之夜影」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u011561335/article/details/91346777

  • 2019-09-26 21:46:36

    Shiro整合JWT+Token过期刷新,demo,详解

    最近使用SpringBoot集成Shiro,JWT快速搭建了一个后台系统,Shiro前面已经使用过,JWT(JSON Web Tokens)是一种用于安全的传递信息而采用的一种标准。Web系统中,我们使用加密的Json来生成Token在服务端与客户端无状态传输,代替了之前常用的Session。 系统采用Redis作为缓存,解决Token过期更新的问题,同时集成SSO登录,完整过程这里来总结一下。

  • 2019-09-26 21:48:15

    解决UEditor超出最大字数后只提示不限制的问题

    最近项目用到百度额UEditor文本编辑器,今天测试向我提出了一个问题。就是在输入的文字超过默认的最大字数限制之后,虽然提示“字数超过最大范围,服务器可能拒绝保存”,但是仍然可以点击保存按钮进行保存。

  • 2019-09-27 14:49:33

    Google Guava介绍和体检

    JDK提供的String还不够好么?也许还不够友好,至少让我们用起来还不够爽,还得操心!举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。

  • 2019-09-28 00:03:21

    shiro的session共享,持久化

     shiro的session创建与session的查询、更新、过期、删除中,shiro对session的操作基本都讲到了,但还缺一个session共享没有讲解;session共享的原理其实在自定义session管理一文已经讲过了,本文不讲原理,只看看shiro的session共享的实现。