2016-03-03 48 views
3

流引發異常考慮下面的虛擬代碼:Java流:從取決於價值流

List<Integer> intList = new ArrayList<>(); 
intList.add(10); 
intList.add(20); 
intList.add(30); 

intList.stream().filter(i -> i > 40) 
    .throwIf(size of list <= 0) 
    .collect(Collectors.toList()); 

有在Java流提供的任何功能,將實現類似於上面的代碼?

注意:上面的代碼只是我正在做的代表,它不是我正在尋找的確切代碼。

回答

5

你可以檢查是否有那個路過你的過濾器的任何元素,並使用OptionalorElseThrow拋出一個異常,如果沒有:

Integer match = 
    intList.stream() 
      .filter(i -> i > 40) 
      .findAny() 
      .orElseThrow(...); 

當然,這樣只會讓你的一個當不拋出異常時傳遞過濾器的元素,所以我不確定它是否正是你想要的。

+0

使用這種方法有一個限制,我們不能從它返回一個列表。 – eatSleepCode

+1

@eatSleepCode在這種情況下,您需要收集列表並在之後檢查它。一個流只能產生一個結果。 –

1

如果你想,如果它的大小超過n個元素返回列表,您可以使用collectingAndThen收集:

List<Integer> list = 
    intList.stream() 
      .filter(i -> i > 40) 
      .collect(collectingAndThen(toList(), l -> { if (l.isEmpty()) throw new WhatEverRuntimeException(); return l;})); 

但是它可能不是爲可讀,因爲它得到,所以你可以簡單地,如果添加採集後的結果聲明:

List<Integer> list = intList.stream().filter(i -> i > 40).collect(toList()); 
if (list.isEmpty()) { 
    throw new WhatEverRuntimeException(); 
} 

最後,如果尺寸下限是,比方說,100,你可能不希望生成列表。在這種情況下,你可以使用兩個流管道,一個算滿足元素的數量必然會設置越低,一個真正生成列表:

long count = intList.stream().filter(i -> i > 40).count(); 
if(count < limit) { 
    throw new WhatEverRuntimeException(); 
} 
List<Integer> list = intList.stream().filter(i -> i > 40).collect(toList());