2019年9月30日 星期一

讀者釋疑 20190930

書籍:

Java SE8 OCPJP進階認證指南

疑問:

您好,我是購買OCP進階認證的讀者
想請教幾件事情

書中15-30的例子

Map的排序是根據丟進去的順序
但是15-60的考題11
為什麼這時候是根據字母順序排列方式?

另外15-69的考題23

我自己測試答案是A

但我主要還是想搞懂groupingBy他在分組的時候是怎麼排序?

因為有的時候他是照放進去的順序
有時候又是根據字母排序
然後15-69又是根據先丟進去的排最後
我該如何判斷?

回覆:

方法回傳型態是Map,原本就無法排序,因此順序不固定。
若要排序,以範例 /OCP/src/course/c16/streamBasic/TerminalOperationCollectDemo.java 的方法 testGroupingBy() 為例,

原本為:
.collect(Collectors.groupingBy(classifier));

需改為:
.collect(Collectors.groupingBy(classifier, TreeMap::new, Collectors.toList()));

如下:
public static void testGroupingBy() {
    Function<Person, Integer> classifier = p -> p.age;
    Map<Integer, List<Person>> personsByAge =
        getPersonList().stream()
    //  .collect(Collectors.groupingBy(classifier));
        .collect(Collectors.groupingBy(classifier, TreeMap::new, Collectors.toList()));
    personsByAge.forEach(
        (age, personList) ->
                System.out.format("age %s: %s\n", age, personList)
    );
}

2019年9月14日 星期六

Eclipse內安裝軟體遇到SunCertPathBuilderException

Eclipse內可以使用「Eclipse Marketplace」擴充功能:


以安裝UMLet為例:



可能會因為提供plugin的網站使用https而安裝失敗:



此時可以修改和「exlipse.exe」同一層目錄的「eclipse.ini」檔案,加上參數
「-Djavax.net.ssl.trustStore」並指向自己JRE保管憑證的trust store檔案位置,如:
-Djavax.net.ssl.trustStore = C:/Java/jdk1.8.0_45/jre/lib/security/cacerts




若問題還是無法解決,請參閱「存取https網址遇到SunCertPathBuilderException 






存取https網址遇到SunCertPathBuilderException


存取https需要有憑證。若使用瀏覽器存取httpsweb site則憑證的問題由瀏覽器處理(將憑證匯入瀏覽器),但若使用Java code直接存取httpsweb siteweb service,就需要自己處理。
若沒有合法憑證去存取httpsURL,常見錯誤訊息為:sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
處理方式是必須將https的憑證(certificate)匯入到自己的JREtrust store內,該trust storeJRE內,如:
1.     C:\Java\jre1.8.0_45\lib\security\cacerts
2.     C:\Java\jdk1.8.0_45\jre\lib\security\cacerts
因為JDK內也有JRE,所以有選項2
一旦匯入完成後,只要由該JRE啟動的Java code都可以直接訪問該https網址。
匯入方式為:
1.     https://github.com/escline/InstallCert下載 InstallCert.java,並依照文章說明步驟進行。文章內容較謹慎,方式為產出trust store檔案後,將憑證由檔案匯出,再匯入自己的JRE內的trust store
2.     經驗上,直接把產出的trust store檔案置換JREtrust store檔案也可以:
甲、產出檔名若為「jssecacerts」,先改名為「cacerts」。
乙、置換JRE內的cacerts,記得先備份,有問題才能還原。