五、雜項

5.1 字符串

Java 8 中,String類只添加了一個方法:join,做用是按照指定分隔符將多個字符串組合起來,能夠認爲它是split方法的反操做。java

String joined = String.join("/", "usr", "local", "bin");
System.out.println(joined);
 
String[] ids = {"1", "3", "6"};
System.out.println(String.join(",", ids));

// 輸出結果是
// usr/local/bin
// 1,3,6

5.2 集合

集合類最大的改變就是支持流操做。另外,還添加了其它一些有用的方法。sql

類/接口 新方法
Iterable forEach
Collection removeIf
List replaceAll, sort
Map forEach, replace, replaceAll, remove(key, value), putIfAbsent, compute, computeIfAbsent, computeIfPresent, merge
Iterator forEachRemaining

其中大部分方法都能直接看出用途,只有compute*、merge、forEachRemaining比較陌生,簡單介紹一下這幾個方法:數組

一、compute

經過key和一個函數計算出新的值安全

Map<String, String> map = new HashMap<>();
map.put("key", "value");
System.out.println(map.compute("key", String::concat));  // 輸出 keyvalue

二、merge

合併value,若是key不存在,使用給定的值做爲value。與compute不一樣的是merge不處理key, eg:計數,若是存在key,+1;若是不存在,賦值爲1ide

Map<String, Integer> map = new HashMap<>();
map.merge("key", 1, (i1, i2) -> i1 + i2);
System.out.println(map.get("key"));  // 輸出 1

map.merge("key", 1, (i1, i2) -> i1 + i2);
System.out.println(map.get("key"));  // 輸出 2

三、forEachRemaining

可以將Iterator中迭代剩餘的元素傳遞給一個函數函數

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    if ("c".equals(it.next())){
        break;
    }
}
it.forEachRemaining(s -> System.out.print(s + " "));  // 輸出 d e

5.3 比較器

Comparator接口新增comparing方法,該方法接收一個函數,函數的返回值就是用於比較的對象。同時,支持多級比較。this

// 先按照name進行排序,若是name同樣,按照age排序
public static void main(String[] args) {
    Person[] ps = {new Person("a", 20), new Person("b", 20), new Person("a", 18)};
    Arrays.sort(ps, Comparator.comparing(Person::getName).thenComparing(Person::getAge));
    System.out.println(Arrays.asList(ps));   // 輸出 [Person{name='a', age=18}, Person{name='a', age=20}, Person{name='b', age=20}]
}

private static class Person{

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 省略get set
 
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

ps:Comparator接口還有其它的一些使用方式,就不一一列舉了。編碼

5.4 Base64 編碼

Base64 編碼是一種將非ASCII字符轉爲ASCII字符的編碼方式,主要用於轉換字節數組成爲可打印的字符序列。在以前的版本,JDK 中提供了 sun.misc.BASE64Encoder 這個類,可是sun.misc 這個包是SUN公司的實現,並不是J2SE規範的實現,並且BASE64Encoder 沒有任何文檔說明,因此咱們通常會本身實現或使用第三方實現。終於,Java 8 提供了一個標準的編碼器和解碼器。code

/*
 * 三種編碼器:
 * 一、常規Base64編碼器,沒有換行
 * 二、電子郵件是用的MIME標準編碼器,每76個字符使用一個"\r\n"換行符
 * 三、對URL和文件名安全的編碼器,使用「-」和「_」替換「+」和「/」
 */
Base64.getEncoder();
Base64.getMimeEncoder();
Base64.getUrlEncoder();

5.5 Null 檢查

Objects類新增了兩個靜態的斷言(pridicate)方法,isNull 和 nonNull,這兩個方法在使用流的時候很是實用。例如對象

stream.anyMatch(Objects::isNull);   // 檢查一個流是否含有null值
stream.filter(Objects::nonNull);  // 獲取全部非null的對象

5.6 JDBC

在Java 8 中,JDBC 已經升級到了4.2版本,該版本爲 java.sql 包中的 Date、Time 和 Timestamp 類提供了一些方法,能夠與 java.time 包中對應的 LocalDate、LocalTime 和 LocalDateTime 類互相進行轉換。

Date date = new java.sql.Date(System.currentTimeMillis());
Instant instant = date.toInstant();
LocalDate localDate = date.toLocalDate();
相關文章
相關標籤/搜索