Java 8 Stream.map()方法介绍

x33g5p2x  于2022-09-17 转载在 Java  
字(3.2k)|赞(0)|评价(0)|浏览(672)

在我们探索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]

Java 8 原始流

如果你在你最喜欢的ide中工作,你会注意到还有三个map方法存在。mapToIntmapToDoublemapToLong是旨在返回原始数据流的方法。如果你想对一个流进行还原操作,这很有帮助。

在上面的方块片段的基础上,将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

使用guava映射值

在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]

相关文章

微信公众号

最新文章

更多