下面是我的代码,我想在Java8中编写更好的等效代码
List<String> fruits = Arrays.asList("Apple","Orange","Banana");
List<String> animals = Arrays.asList("Tiger","Lion","Monkey");
@SuppressWarnings("all")
Map<String,List<String>> allLists = new HashMap() {{
put("fruits",fruits);
put("animals",animals);
}};
传统的Java8检查方式
if(allLists.get("fruits")!=null) {
List<String> fruits1 = allLists.get("fruits");
if(fruits1.contains("Apple")) {
System.out.println("Apple is there");
}
}
Java8做的方式..
Consumer<List<String>> consumer1 = arg ->{
Optional.of(arg.contains("Apple")).filter(value -> value.equals(true)).ifPresent(value1 -> System.out.println("Apple is available"));
};
Optional.of(allLists.get("fruits")).ifPresent(consumer1);
目前Java8的方式是返回输出“Apple is available”..
问题是,如果Apple不在ArrayList中,我该如何处理... 例如:如果Apple不在列表中,我想打印“Apple is not Available”
请建议我更好地处理这两种情况。
答案 0 :(得分:6)
我会在地图上找到getOrDefault,如下所示:
if(allLists.getOrDefault("fruits", Collections.emptyList()).contains("Apple"))
System.out.println("Having apples");
基本上,这消除了您通常所做的无钥匙检查。在您希望继续使用列表(在地图中分组)的情况下,您还可以查看computeIfAbsent
。
答案 1 :(得分:0)
首先,如果向它传递null,<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<table style="float: left;" class="table table-bordered">
<tbody>
<tr>
<td>CPU</td>
<td>
<button type="button" data-exists="cpu" class="btn btn-primary btn-sm cpu">Add CPU</button>
</td>
</tr>
<tr>
<td>Motherboard</td>
<td>
<img src="//img.jpeg" height="42" width="42">
<a href="www.link.com">Test Title</a>
</td>
<td>
<button type="button" data-exists="motherboard" class="btn btn-danger btn-sm motherboard">Edit Motherboard</button>
</td>
</tr>
<tr>
<td>Graphic Card</td>
<td>
<button type="button" data-exists="graphic-card" class="btn btn-primary btn-sm graphic-card">Add Graphic Card</button>
</td>
</tr>
<tr>
<td>Power Supply </td>
<td>
<button type="button" data-exists="power-supply" class="btn btn-primary btn-sm power-supply">Add Power Supply</button>
</td>
</tr>
</tbody>
</table>
将抛出NullPointerException。您需要在此处使用Optional.of
作为
ofNullable
Java 8中的可选项没有可以在未找到值时执行的方法。
但Java-9有ifPresentOrElse需要一个Runnable,你可以在那里打印Apple不在那里
答案 2 :(得分:0)
FWIW,Optional不替换null。巧妙地使用Optional代替null和简单的if ... else检查是个坏主意。
为什么选择:创建可选项以处理Streams上的值/无值(空)个案。创建可选项以避免在流畅链接期间中断用于空值检查的流方法。
在您有正当理由创建可选之前,请不要创建它。
例如:以下不是一个好主意,
String process(String s) {
return Optional.ofNullable(s).orElseGet(this::getDefault);
}
//更好的方式是
String process(String s) {
return s!=null ? s : getDefault();
}
PITFALLS:Optional.get是一个非常有吸引力的方法,但要注意Optional.get抛出&#34; NoSuchElementException&#34;。与java Collections中的get方法不同(如果值不存在,它们不会抛出异常)。 所以使用get方法和isPresent()方法。
您不应使用的地方可选: