2013-02-05 3 views
16

구아바에서 Supplier<T>의 역함수를 찾고 있습니다. Consumer - nope - 또는 Sink -이 존재하지만 원시 값을 나타 내기를 기대했습니다.공급 업체 반전

어딘가에 숨겨져 있고 그것을 놓치고 있습니까?

나는 같은 종류의 이유로 Supplier이 유용하다는 것을보고 싶습니다. 분명히 사용은 덜 일반적이지만, 예를 들어 Suppliers의 정적 메서드 중 많은 부분이 비슷한 방식으로 적용되며 "이 공급 업체에이 모든 값을이 반복 가능 제품"으로 보내는 것이 유용 할 것입니다.

그동안 PredicateFunction<T,Void>은 추악한 해결 방법입니다.

+5

아마도 도움이되지 않지만 소비자 ... Java 8이 있습니다. –

+0

실제로 바이너리 기능을 찾고있을 가능성이 있습니다.이 기능을 사용하면 축소/축소 작업에 적용 할 수 있습니다. 많은 기본 통계 함수가 그런 식으로 구현 될 수 있습니다 (예 : 평균, 표준 시간, 합계, 최소, 최대). 이것은 구아바 문제 목록에서 제안되었지만 너무 기능적이라고 간주되었습니다. – Dibbeke

+0

이 경우 저는 - T를 허용하는 void를 반환하는 단항 함수를 원합니다. 예를 들어, 일반적인 루프는 'for (T elem : iterable) { 싱크대입니다.소비하다 (elem); }' 은'Iterables.apply (iterable, sink)'(또는 아마도'Consumables.consume' 등)로 대체 될 것입니다. – BeeOnRope

답변

8

당신의 대안은 다음과 같습니다

  • 자바 8Consumer 인터페이스하는 당신이 compose을 수를 소개합니다.
  • Xtend의 표준 라이브러리에는 Procedures이 포함되어 있습니다.
  • ScalaFunction*이고; 함수의 반환 유형이 Unit이면 부작용으로 간주됩니다.

이 모든 언어에서 기능 인터페이스를 편리하게 사용할 수 있으므로 예를 들어 다음과 같이 사용할 수도 있습니다. Functional JavaEffect

그렇지 않으면이면 부작용을 수행하기 위해 기존 언어 구문을 사용하는 것이 좋습니다. 내장 된 for 루프. Java < 8은 람다를 사용할 때 엄청난 문법 오버 헤드를 유발합니다. this questionthis discussion을 참조하십시오.

-2

이미 답변을 찾았습니다. 방문하기 만하면 항상 참을 리턴하는 술어와 함 2 필터를 사용할 수 있습니다. 당신이 수퍼 디펜 시브라면, 어떤 술어라도 사용할 수 있으며, 필터 자체에 alwaysTrue가있는 함수 나 함수를 사용할 수 있습니다. 단락을 피하기 위해 끝에 or을 추가하십시오.

문제는 술어가 가능한 한 상태가없고 부작용이없는 반면 개념적으로 술어와 소비자가 다르다는 데 동의하지만 소비자가 부작용 만있는 경우 실제로 구문상의 유일한 차이점은 그 중 하나는 부울 (무시할 수 있음)을 반환하고 다른 하나는 void를 반환합니다. Guava에 Consumer가있는 경우에는 Predicate를 사용하여 Consumer를 가져 오거나 Predicate에서 Consumer로 상속하는 여러 가지 메소드를 복제해야합니다.

+0

문제는 이것이 구현 된 클래스의 이름이 범용 ​​클래스이며, Predicate-always -returns-true는 혼란 스럽습니다. 당신은 공급자 이 쓸모 없다고 동등하게 주장 할 수 있습니다. 입력을 무시하고 함수 을 사용할 수도 있습니다. – BeeOnRope

+3

Iterables.filter()는 게으르므로 결과 Iterable에서 실제로 반복 할 때까지 "Predicate"소비자는 호출되지 않으므로 상당히 엉망이며 버그가 발생할 수 있습니다. 뭔가 쓸 필요가 있습니다. 'Lists.newArrayList (Iterables.filter (iterable, predicateThatIsActuallyAConsumer));)와 같이 사용됩니다. 차라리 for 루프와 프로젝트 별 'Consumer' 클래스를 사용하고 싶습니다. –

+5

-1 이것은 질문에 도움이되지 않기 때문에 -1입니다. 술어는 다른 작동 W 다른 유형을가집니다. 유형 시스템을 오용하고 오해로 이어질 수 있습니다. 그것은 해킹입니다. – Dibbeke