Optional<String> myData;
設定<字串> mySet。
if(myData.isPresent() ) {
if(myData.get().contains("testValue")) {
mySet.add("somedata")。
}
}
if(!myData.isPresent() ) {
mySet.add("someotherdata")。
}
我有一個這樣的場景。我有一個嵌套的if-else塊,我需要使用lambda函式將其轉換為Java8地圖。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
你可以重新修改你的Optional的使用(這只適用于你的代碼,如最初提出的那樣[以防你編輯它]):
Optional<String> myData = ...。
mySet.add(myData.filter(value -> value.contains("testValue"/span>)
.map(ignored -> "somedata")
.orElse("someotherdata"))
你對這個值進行過濾,然后映射它到somedata,否則到someotherdata。
如果你使用的是Java 11,你應該使用:
。myData.filter(value -> value.contains("testValue")
.ifPresentOrElse(忽略 -> mySet.add("somedata"),
() -> mySet.add("someotherdata") )。
由你來決定哪種方法更好(第一種方法是避免在兩個部分中做mySet.add兩次)。
uj5u.com熱心網友回復:
下面的方法應該能行:
Set<String> mySet = myData.stream().map(data -> {
if(data.contains("testValue"/span>) return "somedata";
else return "someotherdata";
}).collect(Collectors.toSet())。
uj5u.com熱心網友回復:
這將重現你之前的結果,但稍作了改動。我認為流解決方案是不必要的,也是不可取的。下面的方法可以:
- 結果是
- 如果有資料但沒有
testValue,則結果是一個空的集合。
- 如果資料不存在,結果是包含
someotherdata的集合 。
- 如果資料存在并且與
testValue相匹配,則在包含
somedata的集合中出現結果。
String result = myData.isPresent() ?
(myData.get().contains("testValue"/span>) ? "somedata" : "")。
"someotherdata"。
if (! result.isBlank()) {
mySet.add(result)。
}
uj5u.com熱心網友回復:
Consumer<Set<String>> addSomeOtherdata = s -> s.add("someotherdata") 。
Consumer<Set<String>> addSomedata = s -> s.add("somedata") 。
Predicate<Optional<String>> isPresent = Optional::isPresent;
謂詞<可選<字串>> containsTestValue = o -> o.get().contains("testValue") 。
消費者<可選<字串>> mainConsumer = (o -> {
if(isPresent.and(containsTestValue).test(o)) {
addSomedata.accept(mySet)。
}
if(isPresent.negate().test(o)) {
addSomeOtherdata.accept(mySet);
}
});
mainConsumer.accept(myData)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/331544.html
標籤:
