在我们探索java 8函数式编程的系列中,接下来是map方法。
map方法是一个转换操作,它是一个functional programming technique,对流中的每一个元素应用一个函数,并返回结果。map的一个常见用途是在java中转换对象。
对于我们的第一个片段,让我们通过向Stream.map()
传递一个接受参数然后乘以10的lambda函数,将列表中的每个元素乘以10。接下来,通过使用java8打印流来显示结果。
@Test
public void map_times_10() {
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> multipleOf10 = myList.stream().map((x) -> x * 10);
multipleOf10.forEach(System.out::println);
}
输出
10
20
30
40
50
为了更便于使用,我们可以通过移动lambda表达式和声明一个函数来重构我们的代码。此外,如果我们要返回一个列表作为数据类型,我们可以将流转换为列表,然后再次输出列表中的值,我们应该看到和上面一样的结果。
@Test
public void map_times_10_refactor() {
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
Function<Integer, Integer> times10 = (x) -> x * 10;
List<Integer> multipleOf10 = myList.stream().map(times10)
.collect(Collectors.toList());
multipleOf10.forEach(System.out::println);
}
输出
10
20
30
40
50
类似于这种方式,让我们创建一个函数,将一个流中的所有数值平方化。我们将创建一个java 8函数,接受一个参数,然后将其乘以自身。接下来我们将对map的结果进行Stream.collect()
的还原操作,并将流转换为一个集合。
@Test
public void map_square_to_set() {
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
Function<Integer, Integer> square = (x) -> x * x;
Set<Integer> squaresList = myList.stream().map(square)
.collect(Collectors.toSet());
squaresList.forEach(System.out::println);
}
输出
16
1
4
9
25
如果你正在寻找一种从对象A转换到对象B的方法,java 8使之变得简单。下面我们将展示如何将一个列表转换为地图,首先创建一个名为JavaScriptFrameworks
的POJO。接下来用三个对象初始化一个List
,我们将用一个stream()
来调用Collectors.toMap
。第一个参数将接受一个函数来生成密钥,而第二个参数将生成值。最后,我们将使用for each
对元素进行循环。
class JavaScriptFrameworks {
private Integer rank;
private String description;
public JavaScriptFrameworks(Integer rank, String description) {
super();
this.rank = rank;
this.description = description;
}
}
@Test
public void objectAObjectB() {
List<JavaScriptFrameworks> framework = new ArrayList<JavaScriptFrameworks>();
framework.add(new JavaScriptFrameworks(1, "Angular"));
framework.add(new JavaScriptFrameworks(2, "React"));
framework.add(new JavaScriptFrameworks(3, "EmberJs"));
Map<Integer, JavaScriptFrameworks> mappedFramework = framework.stream()
.collect(
Collectors.toMap(JavaScriptFrameworks::getRank,
(p) -> p));
mappedFramework.forEach((k, v) -> System.out.println("rank = " + k
- " value = " + v));
}
输出
rank = 1 value = JavaScriptFrameworks [rank=1, description=Angular]
rank = 2 value = JavaScriptFrameworks [rank=2, description=React]
rank = 3 value = JavaScriptFrameworks [rank=3, description=EmberJs]
如果你在你最喜欢的ide中工作,你会注意到还有三个map方法存在。mapToInt
、mapToDouble
和mapToLong
是旨在返回原始数据流的方法。如果你想对一个流进行还原操作,这很有帮助。
在上面的方块片段的基础上,将square
函数传递给map将产生一个整数流。然后调用mapToInt
将返回一个IntStream
,我们可以调用max
来返回流中的最大值。
@Test
public void mapto() {
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
Function<Integer, Integer> square = (x) -> x * x;
IntStream squaresIntStream = myList.stream().map(square)
.mapToInt(Integer::intValue);
System.out.println(squaresIntStream.max().getAsInt());;
}
输出
25
在java 8之前,除非你使用guava这样的库,否则你只能用命令式编程技术来转换java中的值。如果你熟悉这个库,下面的代码将提供一个例子供参考。
@Test
public void map_square_guava() {
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5);
//com.google.common.base.Function
Function<Integer, Integer> square = new Function<Integer, Integer>() {
@Override
public Integer apply(Integer value) {
return value * value;
}
};
List<Integer> squaresList = FluentIterable.from(myList)
.transform(square).toList();
System.out.println(squaresList);
}
输出
[1, 4, 9, 16, 25]
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : http://www.leveluplunch.com/java/tutorials/042-java8-stream-map/
内容来源于网络,如有侵权,请联系作者删除!