Java 8 Stream map

时间:2020-02-23 14:36:19  来源:igfitidea点击:

Java 8 Stream map函数可用于对其所有元素执行某些操作。
Java Stream map是一个中间操作,因此它返回Stream。

Java 8流映射

以下是Java 8 Stream接口中声明的map方法。

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

流映射方法将" Function"作为参数,它是一个功能接口。

现在让我们看一下流图方法变得有用的一些示例。

Java Stream映射示例

假设我们有一个名称列表,并且我们想查找在某些Oracle数据库表中存在的名称。
现在,由于Oracle是区分大小写的,因此我们可以将字符串列表转换为大写,然后在数据库端可以将to_upper方法用于SQL查询。

通常在Java 8之前,我们可以使用for循环来实现它,如下所示。

List<String> names = Arrays.asList("hyman", "amit", "DAVID");

List<String> upperCaseNames = new ArrayList<>();
for (String n : names) {
	upperCaseNames.add(n.toUpperCase());
}
//now send upperCaseNames for processing

我们可以使用java流映射函数来完成相同的操作,如下所示。

upperCaseNames = names.stream().map(t -> t.toUpperCase()).collect(Collectors.toList());

我们也可以像下面这样写。

upperCaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());

带对象的Java Stream映射示例

现在,让我们看一下更实用的流图使用示例。
我们有一个Emp类,如下所示。

package com.theitroad.examples;

public class Emp {

	private int id;
	private String name;
	private long salary;
	private String designation;

	public Emp(int i, String n, long s, String d) {
		this.id = i;
		this.name = n;
		this.salary = s;
		this.designation = d;
	}

	@Override
	public String toString(){
		return id+name+salary+designation;
	}
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public long getSalary() {
		return salary;
	}

	public void setSalary(long salary) {
		this.salary = salary;
	}

	public String getDesignation() {
		return designation;
	}

	public void setDesignation(String designation) {
		this.designation = designation;
	}

}

我们有一种获取所有员工数据的方法。
现在,我们希望将员工数据传递到HR系统,但我们不想透露薪水。
因此,我们将必须使用以下代码来处理每个员工并除去他们的薪水。

List<Emp> empForHR = new ArrayList<>();
	for(Emp e : allEmpList){
		Emp temp = new Emp(e.getId(),e.getName(),e.getSalary(),e.getDesignation());
		temp.setSalary(0);
		empForHR.add(temp);
	}

现在使用Java 8流映射功能,我们可以像下面一样做同样的事情。

empForHR = allEmpList.stream().map(e -> {
		e.setSalary(0L);
		return e;
	}).collect(Collectors.toList());

以下是带有对象转换的java流映射示例的最终程序。

package com.theitroad.examples;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class JavaStreamMapExample {

	public static void main(String[] args) {

		List<Emp> allEmpList = getAllEmps();
		System.out.println(allEmpList);
		
		List<Emp> empForHR = new ArrayList<>();
		for(Emp e : allEmpList){
			Emp temp = new Emp(e.getId(),e.getName(),e.getSalary(),e.getDesignation());
			temp.setSalary(0);
			empForHR.add(temp);
		}
		System.out.println(empForHR);
		
		empForHR = allEmpList.stream().map(e -> {
			e.setSalary(0L);
			return e;
		}).collect(Collectors.toList());
		System.out.println(empForHR);
	}

	private static List<Emp> getAllEmps() {
		List<Emp> el = new ArrayList<>();
		Emp e1 = new Emp(1, "hyman", 100L, "SE");
		el.add(e1);
		Emp e2 = new Emp(2, "David", 200L, "QE");
		el.add(e2);
		Emp e3 = new Emp(3, "Lisa", 300L, "CEO");
		el.add(e3);
		return el;
	}

}

当我们运行上面的程序时,我们得到下面的输出。

[1hyman100SE, 2David200QE, 3Lisa300CEO]
[1hyman0SE, 2David0QE, 3Lisa0CEO]
[1hyman0SE, 2David0QE, 3Lisa0CEO]

我们还可以在map方法Function实现中将Emp对象转换为其他对象。