Java8方式来处理if..else签入集合

时间:2018-04-18 05:43:22

标签: java java-8

下面是我的代码,我想在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”

请建议我更好地处理这两种情况。

3 个答案:

答案 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&nbsp;</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()方法。

您不应使用的地方可选:

  • 不要创建可选类型字段
  • 不要使用可选参数(强制某人创建空 可选而不是传递null真的很糟糕)
  • 不要将Java集合与Optional结合使用。