将消费者转换为功能

Pau*_*ton 15 java java-8 java-stream

Function接口的许多lambda都采用了这种形式

t -> {
    // do something to t
    return t;
}
Run Code Online (Sandbox Code Playgroud)

我经常这样做,所以我已经为此编写了一个方法.

static <T> Function<T, T> consumeThenReturn(Consumer<T> consumer) {
    return t -> {
        consumer.accept(t);
        return t;
    };
}
Run Code Online (Sandbox Code Playgroud)

这使我能够做到这样的非常好的事情:

IntStream.rangeClosed('A', 'Z')
         .mapToObj(a -> (char) a)
         .collect(Collectors.collectingAndThen(Collectors.toList(), consumeThenReturn(Collections::shuffle)))
         .forEach(System.out::print); 
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以在不依赖我自己的方法的情况下进行这样的转换吗?我错过的新API中有什么东西会让我的方法变得多余吗?

spr*_*ter 6

有许多潜在的有用的方法,可以被添加到Function,ConsumerSupplier接口.您举了一个很好的例子(将a转换Consumer为a Function),但还有许多其他潜在的转换或实用程序可以添加.例如,使用Functionas Consumer(通过忽略返回值)或作为Supplier(通过提供输入值).或者通过提供任一值将a转换BiFunction为a Function.当然,所有这些都可以在代码中手动完成,或者如您所示通过实用程序功能提供,但在API中具有标准化机制可能是有价值的,如许多其他语言中所存在的那样.

这是我的猜测,但我猜这反映了语言设计者希望尽可能保持API的清洁.然而,我对Comparator这种语言提供的非常丰富的实用程序的对比(作为一个例子)很感兴趣,它可以通过几个标准进行比较,处理空值等等.这些也很容易留给用户但是已由API提供.我很想知道其中一位语言设计师为什么这些接口的方法看起来如此不一致.

  • @Paul Boddington:虽然很明显功能类型在长期列表中,但我不知道"不久的将来".目前,我觉得它们不会很快出现.但是,仍然有今天做出的设计决定,可以想象的是保持道路畅通的愿望.所以有一些功能接口只是今天实际需要添加,例如Stream API,但没有更多,一切都有点简约,我不希望它们增长太多,因为维护者的明显偏好是真正的功能方向. (4认同)
  • 另一个响起的例子是`CompletableFuture`,上次我检查它包含近60种方法...... (3认同)
  • "比较器"具有某种*语义*,所有添加的方法都处理该语义.相比之下,`java.util.function`包中的类型是通用的,并解决了Java中缺少真正的函数类型的问题.可以合理地假设Java维护者不愿意将功能转换方法添加到这些接口中,因为他们期望在未来的Java版本中以不同的,更通用的方式处理它们(当真正的函数类型进入阶段时)...... (2认同)
  • @Holger我希望你是对的.我和你在语言中作为一等公民的功能有着同样的感觉,虽然这只是我自己的纯粹直觉(或者可能是欲望?).当然,`java.util.function`包非常简约,就像流API一样.但是,当我看到它时,我会相信它...首先我需要看[专业化](http://openjdk.java.net/jeps/218),否则语言会变得混乱 (2认同)