VextoR:
há uma boa maneira de criar uma lista diferente se o fluxo está vazio?
Aqui se special
está vazio Eu quero criar uma nova List
com outro valor. Mas se special
não está vazio Eu quero criar List
com base em special
. Não sei se existe uma boa maneira de combiná-las com um fluxo
Aqui está uma solução não tão agradável
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 .:
se você quiser tê-lo como um único gasoduto então você poderia fazer:
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)));
No entanto, eu não recomendaria processo com esta abordagem, simplesmente porque não é a finalidade pretendida de opcionais.
em vez disso, você seria melhor fora com:
List<String> result;
if(special.isEmpty())
result = Collections.singletonList(myString);
else
result = special.stream().map(s -> createNewVal(s)).collect(Collectors.toList());
- Este último é definitivamente mais legível, portanto, faz com que menos trabalho para o cérebro na tentativa de descobrir o que está acontecendo. ;)
- Os últimos evita também a criação de uma instância opcional levando a uma melhor eficiência