我想有机会在流中进行空检查:
firstItem = array.stream().min(myComparator).get();
if(firstItem!=null){
name = firstItem.getData().get("Name")
}
是否有可能从流中获得name
?
答案 0 :(得分:1)
请注意,Optional
不能包含空值,因此您的代码将执行条件,或者在get()
处发生异常而失败。
您可以将get()
更改为orElse(null)
;但是你仍然需要单独的条件。
相反,请使用Optional.map
,然后使用orElse
:
String name =
array.stream()
.min(myComparator)
.map(m -> m.getData().get("name"))
.orElse(someDefaultValue);
当然,如果您不想指定默认值,则可以省略最终orElse
,并将变量类型设为Optional<String>
。
答案 1 :(得分:1)
试试这个:
String name = array.stream().min(myComparator) //
.map(item -> item.getData().get("Name")) //
.orElse("No Name");
答案 2 :(得分:0)
不幸的是,没有办法避免某种检查或默认值(如前面的答案中已经发布的那样)。话虽如此,有一种很好的方法可以用选项进行检查。让我给你举个例子。 我已经为测试创建了简单的类。
class ExampleData
{
private String name;
private int value;
public ExampleData(String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public int getValue() {
return value;
}
@Override
public String toString() {
return "ExampleData{" +
"name='" + name + '\'' +
", value=" + value +
'}';
}
}
现在让我们编写一个简单的测试方法。
public void testApp()
{
ArrayList<ExampleData> array = new ArrayList<>(Arrays.asList(
new ExampleData("TestName", 1),new ExampleData("TestName1", 2)));
Optional<ExampleData> min = array
.stream()
.min(Comparator.comparingInt(ExampleData::getValue));
min.ifPresent(System.out::println);
}
请注意,我没有立即使用get()
。相反,当我想提取价值时,我使用了ifPresent
方法。我不知道您是否使用过C#语言,但这种方法让我想起了c#中的?
运算符。
在c#中你只需要做这样的事情
String name = possibllyNullValue?.getName();
所以在Java中你可以用ifPresent()
当然ifPresent
返回void,因此在某些情况下会很不方便。