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



  • 2020-11-22 20:56:13

    Dagger2使用详解

    简单的说,就是一个工厂模式,由Dagger负责创建工厂,帮忙生产instance。遵从Java规范JSR 330,可以使用这些注解。现在不研究Dagger2是如何根据注解去生成工厂的,先来看看工厂是什么东西,理解为什么可以实现了DI(Dependency Injection),如何创建IoC(Inverse of Control)容器。

  • 2020-11-22 21:00:28

    dagger.android--Fragment,BaseFragment

    1 使用Fragment参数来代替Activity参数 2 使用 @FragmentKey来代替@ActivityKey 3 使用HasFragmentInjector来代替@HasActivityInjector 4 AndroidInjection.inject(Fragment)方法,在Fragment的onAttach()中调用,而不是在onCreate()中 5 Fragment的Module添加位置,和Activity是不同的,它取决于Fragment需要的其他依赖注入

  • 2020-11-22 21:12:30

    Dependency Injection with Dagger2,Fragment

    標註@Provides的method若有parameter的話,Dagger會找出其擁有的該型態物件來使用。我們在Module內新增了DataModel將其列入Dagger的管理下,接著在provideFactory()增加parameter變成provideFactory(DataModel dataModel),Dagger就會找出其管理的DataModel給provideFactory使用。

  • 2020-11-22 22:58:52

    Android LiveData Transformations

    有时候有这样的需求,需要在LiveData将变化的数据通知给观察者前,改变数据的类型;或者是返回一个不一样的LiveData。

  • 2020-11-22 23:00:16

    androidx中的lifecycle组件

    Lifecycle-aware components生命周期感知组件执行操作,以响应另一个组件生命周期状态的更改,例如Activity和Fragment。这些组件可以帮助您生成更有组织、更容易维护的轻量级代码。

  • 2020-11-22 23:02:50

    Android数据存储之DataBase的Room

    Room是Google在AndroidX中提供的一个ORM(Object Relational Mapping,对象关系映射)库。它是在SQLite上提供的一个抽象层,可以使用SQLite的全部功能,同时可以更好更便捷流畅地访问数据库。(关于AndroidX可以参考

  • 2020-11-22 23:04:39

    Android组件 LiveData与MutableLiveData教程

    LiveData与ViewMode是经常搭配在一起使用的,但是为了不太混乱,我还是拆分开来说明,此篇博客只讲解 LiveData 与 MutableLiveData的概念与使用方式(但是会涉及到ViewMode的部分代码).

  • 2020-11-22 23:14:52

    Dagger 2 在 Android 上的用法

    在前面的文章我们介绍了Dagger2 中的大部分注解的使用,接下来我们从源码角度分析下第一篇文章中例子的原理。