什么是使用Java 8避免在lambda内使用null的最佳方法?

时间:2016-12-12 20:53:32

标签: java lambda java-8

我有这段代码,并且我试图弄清楚使用Java 8避免空指针异常的最佳方法是什么?

promotion.forEach(item ->
    item.getDiscount().getPromotions().forEach(promotion -> {
        // logic code here
    })
);

3 个答案:

答案 0 :(得分:4)

避免NullPointerExceptions的最佳方法是避免使用空值。在您的示例中,请确保所有方法永远不会返回null。

您没有返回null,而是有几个选项:

  • 抛出一个例外。例如,如果方法的输入导致除数为零,则可以抛出异常而不是返回null。
  • 返回一个空的Optional。例如,可以更改返回String的方法以返回Optional< String>。如果没有要返回的String,则返回Optional.empty()
  • 返回一个空集合(例如,当结果类型为List时,如果找不到结果则返回空List,而不是返回null)
  • 返回自定义结果类型,能够反映结果。例如,在进行验证时,您可以返回表示成功/失败和错误消息的ValidationResult,而不是在没有错误时返回空错误消息

答案 1 :(得分:3)

您是否正在考虑类似Optional的内容:

item.getDiscount().getPromotions().stream().forEach(promotion ->     
    Optional.ofNullable(promotion).ifPresent(p -> {
        // logic code 
    } )
);

编辑:如果item.getDiscount()可能为null,那么您可以尝试:

Optional.ofNullable(item.getDiscount()).ifPresent(d -> 
    d.getPromotions().stream().forEach(promotion ->     
        Optional.ofNullable(promotion).ifPresent(p -> {
            // logic code 
        } )
    )
);

答案 2 :(得分:2)

InitialContext ic=null;

CRUDStudentRemote bean=null; 


@GET
    @Path("getplayers")
    @Produces({MediaType.APPLICATION_JSON})
    public ArrayList<String> getPlayers() {

        try{
            ic=new InitialContext();

            bean = (PlayerRemote) 
                    ic.lookup("Projects/Player!ejb.PlayerRemote");

            ArrayList<String> ls;
            ls = bean.getFromTeam("teamA");

            System.out.println(ls.size());
            return ls;

        }
        catch(NamingException e){
            System.out.println("error.");
            e.printStackTrace();
            System.exit(1);
        }


        return null;

    }

您可以在逻辑代码中使用它们之前过滤掉所有null元素,以便只有非null元素才能运行逻辑代码。