2017-10-13 1 views
5

에 여러 배열을 줄이고이 수행하여 Java8 새로운 람다와 List<String>List<Map<String, Object>>을 줄일 :I 필터링하기 위해 노력하고있어 목록

List<Map<String, Object>> myObjects = new ArrayList<>(); 
myObjects.stream() 
    .filter(myObject-> myObject.get("some integer value").equals(expectedValue)) 
    // myObject.get("some attribute") == ["some string", "maybe another string"] 
    .map(myObject-> myObject.get("some attribute")) 
    .collect(Collectors.toList()); 

결과는 목록입니다하지만 내부의 모든 문자열을 결합하려는 결과는 List<String>가됩니다.

을 명확히하기 위해, 이것은 내가 지금지고있어 결과입니다

ArrayList{["some string"], ["another string"]} 

하지만 난이 원하는 :

ArrayList{"some string", "another string"} 

누군가가 나에게 내가 줄 필요가있는 부분에 힌트를 줄 수 String[] ~ String? 나는 .map() 부분에 그것을 짐작할 것이다. 그러나 나는 내가 거기에서 무엇을 바꿀 것인지 모른다.

편집 :List<Map<String, Object>> myObjects 테스트 목적으로 생성 할 수있는 방법

:

List<Map<String, Object>> myObjects = new ArrayList<>(); 
Map<String, Object> myObject = new HashMap<>(); 
myObject.put("some integer value", 1); 
String[] theStringIWant = new String[1]; 
theStringIWant[0] = "Some important information I want"; 
myObject.put("some attribute", theStringIWant); 
myObjects.add(myObject); 

다음과 같습니다

List<MyObject{"some attribute": 1}> 

: 그건 그냥 예입니다 내 unittest에서. 목록 normaly에는 하나 이상의 요소가 포함되어 있으며 모든지도에는 some attribute뿐만 아니라 더 많은 특성이 있습니다.

+3

어렵지만, 아마 .flatmap (myObject-> (list) myObject.get ("list")) .stream())' –

+1

몇 분만 기다려 주시면 실제 목록을 더 잘 보여줄 수 있습니다. :) – Peter

+0

내가 이것을 시도하면'java.lang.ClassCastException : [Ljava.lang.String; java.util.List'에 캐스트 할 수 없습니다. – Peter

답변

4

당신은 다른 필터가해야 할 수도 있습니다,하지만 난 그것을 만들 것입니다 방법입니다

public static void main(String[] args) { 
    List<Map<String, Object>> myObjects = new ArrayList<>(); 
    Map<String, Object> myObject1 = new HashMap<>(); 

    myObject1.put("some attribute", 1); 
    myObject1.put("some string", new String[] { "Some important information I want"}); 
    myObjects.add(myObject1); 

    Map<String, Object> myObject2 = new HashMap<>(); 
    myObject2.put("some attribute", 1); 
    myObject2.put("some string", new String[] { "hello", "world" }); 
    myObjects.add(myObject2); 

    Map<String, Object> myObject3 = new HashMap<>(); 
    myObject3.put("some attribute", 2); 
    myObject3.put("some string", new String[] { "don't", "want", "this"}); 
    myObjects.add(myObject3); 

    Map<String, Object> myObject4 = new HashMap<>(); 
    myObject4.put("some string", new String[] { "this", "one", "does", "not", "have", "some attribute"}); 
    myObjects.add(myObject4); 

    List<String> list = myObjects.stream() 
      .filter(map -> map.containsKey("some attribute")) 
      .filter(map -> map.get("some attribute").equals(Integer.valueOf(1))) 
      .flatMap(map -> Arrays.stream((String[])map.get("some string"))) 
      .collect(Collectors.toList()); 

     System.out.println(list); 
    } 

결과는 당신의`원래지도`를 보지 않고 말할 [Some important information I want, hello, world]

3

당신은 map 방법 대신 String[]Stream를 반환으로 flatMap 방법으로 그것을 얻을 수있을 것입니다 :

myObjects.stream() 
    .filter(myObject-> myObject.get("some integer value").equals(expectedValue)) 
    .flatMap(myObject-> Arrays.stream((String[])map.get("some attribute"))) 
    .collect(Collectors.toList()); 

그러나 알고 Arrays.stream((String[])map.get("some attribute"))Exception를 발생하는 경우, 예를 들어, 그 map.get("some attribute")String[]이 아닌 경우 스트림에 의해 삼켜집니다.

+0

슬프게도 당신의 버전도'List '를 얻습니다. M. le Rutte의 답변은 저에게 효과적입니다. 그러나 (예제 코드에서 몇 가지 실수를했기 때문에) 모든 노력을 기울여 주셔서 감사합니다. – Peter

+0

맞습니다.'Stream.of'는'String' [string]을 단일 요소로 반환합니다. 이는 원하는 것이 아닙니다. 나는 대답을 업데이트했다. – user1983983