2017-05-04 82 views
1

試圖瞭解如何使用一些Java 8的功能,並且使用多維對象數組來玩耍,如果我想要在多維數組中找到第一個實例的值的物體。Java 8在對象的多維數組中找到值的第一個實例

Objects[][] someArray= ..... 


Arrays.stream(someArray) 
       .map(someArrayFirst -> Arrays.stream(someArrayFirst)) 
       .map(unsure what to do here) 
       .filter(a -> a.equals("some value")) 
       .findFirst(); 

編輯,感謝您的意見。在這裏幫助別人就是我現在擁有的東西。

Arrays.stream(someArray) 
       .flatMap(someArrayFirst -> Arrays.stream(someArrayFirst)) 
       .filter(MyCustomClass.class::isInstance) 
       .map(MyCustomClass.class::cast) 
       .filter(v -> v.value().equalsIgnoreCase("SomeString")) 
       .findFirst(); 
+4

使用'flatMap'而不是'map'(並刪除第二個'map') – 4castle

回答

4

你是在正確的軌道上。你需要把兩個維度成一個單一的數據流,然後採取滿足您的條件的第一個元素:

String[][] array; 
Optional<String> result = Arrays.stream(array) 
    .flatMap(Arrays::stream) 
    .filter("some value"::equals).findFirst(); 

第一stream產生Stream<String[]>。平面地圖將每個數組元素轉換爲Stream<String>。然後它只是篩選你想要的值並獲得滿足條件的第一個元素。

1
static String[][] arr = new String[][]{{"x","y"},{"z","v"},{"b","z"}}; 
static String searchStr = "x"; 
static String searchObj = null; 

public static void main(String... args) { 

    Arrays.stream(arr) 
    .forEach((subarr)->{ 
     Optional<String> opt = Arrays.stream(subarr) 
       .filter((obj)->obj.equals(searchStr)) 
       .findFirst(); 
     if (opt.isPresent()) 
      searchObj = opt.get(); 
    }); 
    System.out.println(searchObj); 
} 

static public String mapFlatMethod(String[][] arr, String searchStr) { 
    return Arrays.stream(arr).flatMap(row -> Stream.of(row)) 
      .filter((obj)->obj.equals(searchStr)) 
      .findFirst().get(); 

} 
+1

對您的第一個解決方案的評論:通常是帶有副作用的lambda表達式(例如爲變量賦值)的做法很糟糕。有很多很好的解釋,說明爲什麼在SO和其他地方這是不好的做法。 – sprinter

+1

對第二種解決方案的評論:如果沒有元素通過過濾器謂詞,'get'將拋出異常。這可能不是你想要的。更好地使用'orElse(null)'或者(最好)返回'Optional'。 – sprinter

相關問題