2016-11-23 100 views
3

我不太熟練Java,所以我想知道我是否在這裏做。java 8空值對象或屬性上的默認值的getter

正如標題所述,下面的代碼用於在空對象或具有空屬性值的對象上獲取屬性時獲取某些默認答覆。

這似乎工作,但我會很感激,如果有人能告訴我,如果我以正確的方式看問題。

import java.util.Optional; 
import java.util.function.Function; 

public class ReplyOnNullPointer { 

    static class C{ 
     private String a; 
     public C(String a){this.a=a;} 
     public String getAtt(){return a;} 
    } 


    private static<I,R> R getterWithDefault(I o,Function<? super I,R> mapper, R orDefault){ 
     return Optional.ofNullable(o).flatMap(x->Optional.ofNullable(mapper.apply(x))).orElse(orDefault); 
    } 

    public static void main(String[] args) { 
     C o1 = null; 
     C o2 = new C(null); 
     C o3 = new C("attribut"); 

     System.out.println("o3 : "+o3); 
     System.out.println("o3.att : "+o3.getAtt()); 
     System.out.println(); 

     System.out.println("o2 : "+o2); 
     System.out.println("o2.att : "+o2.getAtt()); 
     System.out.println("o2.att : "+Optional.of(o2).flatMap(x->Optional.ofNullable(x.getAtt())).orElse("<nope>")); 
     System.out.println(); 

     System.out.println("o1 : "+o1); 
     System.out.println("o1.att : "+Optional.ofNullable(o1).flatMap(x->Optional.ofNullable(x.getAtt())).orElse("<nope>")); 

     System.out.println(); 
     System.out.println("o1.att : "+getterWithDefault(o1,C::getAtt,"<nope>")); 
     System.out.println("o2.att : "+getterWithDefault(o2,C::getAtt,"<nope>")); 
     System.out.println("o3.att : "+getterWithDefault(o3,C::getAtt,"<nope>")); 

    } 
} 

的輸出中看起來是這樣的:

o3 : [email protected] 
o3.att : attribut 

o2 : [email protected] 
o2.att : null 
o2.att : <nope> 

o1 : null 
o1.att : <nope> 

o1.att : <nope> 
o2.att : <nope> 
o3.att : attribut 

感謝你的更正/意見/通知:

+5

SO可能不是最好的地方問這個問題。你應該去這裏http://codereview.stackexchange.com/ – Diyarbakir

+4

@Alfabravo關閉一個問題,如果它是離題。無論它是否在其他地方進行專題討論,Code Review或其他SE網站都無關緊要。 – Mast

+0

@Mast嗨!當我投票結束時,這個評論是由SO產生的。此外,它是相關的,因爲問題可能會轉移到SE上的網站,所以OP可以得到有用的幫助(這就是這一切的目的,對吧?)。 – Alfabravo

回答

0

我認爲這只是:

Optional.ofNullable(o).map(mapper).orElse(orDefault); 

你不需要flatMap(x->Optional.ofNullable(mapper.apply(x))) ,這正是鏈接mapOptional我這樣做。

+0

好吧,mapper不是可選的類型(它是函數映射器,而不是函數<?super I,可選>映射器在javadoc中是必需的)。這是因爲mapper可以是一個不使用Optionals的隨機類的getter。所以我想我應該添加可選的手動封閉..但是如果你說它已經完成了.. – user3617487

+0

@ user3617487'Optional.map(Function <?super T,?extends U> mapper)'returns'可選',不是'U'。所以你不需要一個返回可選參數的getter – lexicore