如何使一个函数返回它的第一个参数有用吗?

时间:2018-06-17 09:08:37

标签: java function jvm arguments parameter-passing

看看this功能。此函数接受两个参数并返回它传递的第一个参数。这样的功能怎么可能有用呢?

2 个答案:

答案 0 :(得分:1)

我可以想到一个场景:

假设您有一些某些对象的流,并将它们收集到Map中。某些Collectors.toMap()变体具有合并函数参数,用于处理合并重复键。即如果相同的键具有多个值,则合并功能确定将与该键关联的值。

public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction)

正如您所看到的,merge函数是一个BinaryOperator<U> - 一个函数,它接受两个相同类型的参数并返回相同类型的结果。

如果你想要一个总是使用与给定键相关联的第一个值的合并函数,并忽略任何后面的值,你需要一个接收两个参数并返回第一个参数的函数。当然,可以使用简单的lambda表达式(v1,v2)->v1轻松编写这样的函数,因此您不必定义一个显式方法来执行此操作。

答案 1 :(得分:0)

在某些情况下,需要将两个或多个值合并为一个。如果“合并”并不是指除了选择其中一个值之外的任何其他内容,那么可能需要这样的功能。

看看这个捏造的例子:

Map<String, Integer> map = IntStream.range(0, 20)
                .mapToObj(i -> String.valueOf( i % 3))
                .collect(Collectors.toMap(
                            Function.identity(), 
                            String::length, 
                            (a, b) -> a)
                        );

根据Collectors.toMapmergeFunction“用于解决与提供给Map.merge(Object,Object,BiFunction)相同的键关联的值之间的冲突”。所以在这个假设的要求中,结果{0=1, 1=1, 2=1}很好(找到每个余数除以3的结果的任何整数)。

在上面整数流的逻辑中,我只需要按键找到任何元素,所以只选择一个元素的函数就可以了。