VextoR:
ストリームが空である場合は、別のリストを作成するための良い方法はありますか?
ここにいる場合はspecial
、私は新しいを作成したい空でList
別の値で。しかし、場合special
である私が作成したい空ではないList
に基づきますspecial
。私はストリームとこれらを結合する良い方法があるかわかりません
ここではとても素敵ではないソリューションです
class X {
public static void main(String[] args) {
String myString = "test";
List<String> special = getSpecialVals();
List<String> newVals =
special.isEmpty() ?
Arrays.asList(myString) :
special.stream().map(s ->
createNewVal(s)).collect(Collectors.toList());
}
static public List<String> getSpecialVals() {
// but can return empty list
return Arrays.asList("One", "Two");
}
static public String createNewVal(String origVal) {
return origVal.toUpperCase();
}
}
Ousmane D .:
あなたは、単一のパイプラインとしてそれを持っているしたい場合は、あなたが行うことができます:
List<String> strings =
Optional.of(special)
.filter(e -> !e.isEmpty())
.map(l -> l.stream().map(s -> createNewVal(s))
.collect(Collectors.toList()))
.orElseGet((() -> Collections.singletonList(myString)));
しかし、私はそれがオプションの使用目的ではありませんという理由だけで、このアプローチを進めてお勧めしません。
その代わり、あなたが持つほうが良いでしょう。
List<String> result;
if(special.isEmpty())
result = Collections.singletonList(myString);
else
result = special.stream().map(s -> createNewVal(s)).collect(Collectors.toList());
- 後者は、それゆえ何が起こっているかを把握しようとしている脳のための少ない作業を起こし間違いなく、より読みやすいです。;)
- 後者はまた、ことを回避するより良い効率をもたらす任意のインスタンスを作成します