2016-06-22 4 views
1

여러 키를 매핑 수집 각각의 키를 사용하여 Map<String, Foo>Stream<Foo> :자바 스트림은 <p></p>가 나는 <code>Foo</code> 인터페이스를 가지고 ... 내가 다음 자바 8 스트림 꽤 잘 받고 있지만, 생각했다

Map<String, Foo> foosByKey = fooStream.collect(
    Collectors.toMap(Foo::getKey, Function.identity())); 

그러나 나는 Map<Bar, Foo>로를 수집 할 경우? 즉, 증기에있는 각 Foo에 대해 Foo.bars()에 의해 반환 된 Bar 인스턴스의 모든 하나에 키가 입력 된 Foo을 맵에 넣고 싶습니다. 어디서부터 시작해야합니까?

+0

아니요, 당신은 거꾸로 가지고 있습니다. 'Map '은'Bar'와'Foo' 인스턴스 사이에 일대일 매핑을 암시합니다. 'Map '또는'Map '을 고려해보십시오. 사용자가 여러 신용 카드를 사용할 수 있고 책에 여러 ISBN이있을 수 있습니다. 여기에 복잡한 것은 없습니다. –

+0

나는 그 의미를 이해하지만, 나는 약간 부수적 인 점에 매달 리고 싶지 않았다. 매핑이 양방향인지 여부는 그래프가 방향인지 여부에 따라 다릅니다. Java 'Map'은 단방향이므로 다시 매핑 할 수 없습니다. 예를 들어 구아바에는 'BiMap'이 있습니다. 저는 여러분이 _relationship_이 일대일이라고 말하고 싶다고 생각합니다.이 경우 _relationship_은 many-to-one ('Bar' -'Foo')입니다. 그러나 다시 한번 이것은 요점 옆에 모든 종류의 것입니다 --- 맥주에 대해 토론 할 것들. 요약하면 각'Foo'는'Bar'를 많이 가질 수 있으며'Bar'를'Foo'에 매핑하려고합니다. 건배! –

+0

사실 우리는 각각의 'Foo'가 많은 'Bar'를 가질 수 있고 모든 Bar는 구별되며, [Sotirios의 대답] (http://stackoverflow.com/a/37956805/2711488)에는 적절한 해결책이 들어 있습니다. 당신이 그의 대답을 받아들이지 못하게하는 것이 있습니까? – Holger

답변

2

here을 제안 했으므로 각각 Foo에서 Bar 값을 추출하여 쌍을 만들 수 있습니다. 쌍을 얻은 다음 Map으로 수집 할 수 있습니다. 가 사용할 수 있기 때문에 예를 들어,

Map<Bar, Foo> map = fooStream.flatMap(foo -> foo.bars().map(bar -> new SimpleEntry<>(bar, foo))) 
      .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); 

우리는 (자바 간단한 Pair 유형이없는) 여기 SimpleEntry를 사용합니다. 당신은 더 구체적으로 당신 자신을 쓸 수 있습니다.

+1

'SimpleEntry <>'사용은 멋지다. 나는 자바가 적어도'쌍 '과 비슷한 것을 가지고 있다는 것을 깨닫지 못했다. 전반적으로 나는 좀 더 컴팩트 한 것을 기대했지만 이것이 우리가 얻을 수있는 최선일 것입니다. 다른 옵션이 있는지 좀 더 오래두고 보겠습니다. –

+1

Java 9는'Map.entry (bar, foo) '를 사용하여 값 기반의 불변 항목을보다 간결하게 생성 할 수있는 가능성을 제공합니다. – Holger