2017-11-28 6 views
1

값이 foo이고 StreamConsumer<Foo> 공백 함수 인 경우 각 함수를 값에 적용하는 가장 간단한 방법은 무엇입니까? 지금은 형편없는일련의 void 함수를 단일 값에 적용하기위한 함수형 프로그래밍 관용구

consumers.forEach(c -> c.accept(foo)); 

을 가지고,하지만 난이 내부를 끌 수있는 방법이있을 수 있습니다 의심 그냥 방법 참조 (명시적인 람다)와 함께 할. 아마도 싱글 톤 목록과 zip()을 가진 무언가입니까?

Java 8의 응답 또는 Vavr 또는 Scala에 만족합니다.

(이이 배 아니거나 적어도 보통 foldLeft/ foldRight 응용 프로그램합니다; 반환 값이 있다면, 내가 그들에 반복하지,이를 폐기 할 것.)

+0

을 할 수 있어야한다 * ['소비자 # andThen (소비자 이후)'(https://docs.oracle.com/javase/8/docs를 통해 * 합치 /api/java/util/function/Consumer.html#andThen-java.util.function.Consumer-) 유효한 옵션은 무엇입니까? – Izruo

+0

흥미로운 질문이지만 자바에서는 기존 VM보다 단순한, 간결한, 또는 성능이 뛰어난 VM은 없습니다. –

+0

forEach와 void 함수는 함수 관용구에서 사용되지 않습니다 ... 존재하지 않는 무언가를 찾고 있습니다 – naomik

답변

0

당신은 줄일 수

consumers.reduce(Consumer::andThen).ifPresent(c -> c.accept(foo)); 

을하지만이 방법과 당신 사이에는 차이가 없습니다, 그리고 당신은 '짧은 : 다음 Consumer.andThen 방법의 수단하여 소비자들은 foo 인수 결과 소비자를 적용합니다.

0

스칼라에서 당신이

consumers.foreach(_.accept(foo)); 
+2

그게 바로 OP _did_ 인 바로 그 질문에 있습니다. – jwvh

+0

정확히 동일하지는 않습니다. 동일한 바이트 코드로 컴파일되지만 다른 구문을 사용합니다. 나는 이것이 혁명적이라고 말하는 것이 아니라 다윗이 더 간결한 방식으로 그것을 할 길을 물었습니다. 이것은 더 짧습니다. 그렇죠? – haaawk

+0

사실, 당신이 정말로 간결한 스칼라를 얻으려고한다면'foreach' ('forEach'는 스칼라가 아닙니다)를 쓰면 세미콜론';'(자바가 아닌 스칼라)을 버릴 수 있습니다. 그 후에도 우리가 [code golf] (https://en.wikipedia.org/wiki/Code_golf) 라운드를 진행한다면, 나는 여전히 당신이 2 스트로크를 이겨낼 것입니다 : for (c <-consumers) c.accept (foo)' – jwvh