1. 程式人生 > 實用技巧 >Java-Java8特性(完結)

Java-Java8特性(完結)

Java8新特性

之前零零散散寫了很多java8的內容,今天做一個整理,也算是整理用到的內容,當然細化的話還有很多,只是說暫時用不到,為了面試的話已經夠了

  • Lambda表示式
  • 函式式介面(比較器Comparator介面)
  • 方法引用
  • Stream流操作
  • Optional
  • Base64
  • 其他(HashMap效能提升,IO/NIO改進)

  1. Lambda表示式

    有句話感覺說的很好,Lambda主要就是簡潔程式碼量,

  2. 函式式介面

    之前筆記:https://www.cnblogs.com/meditation5201314/p/13192254.html

  3. 方法引用

    就是內部使用靜態類,簡化程式碼

    //Hero內部中:
        public static int compareByName(Hero a, Hero b) {
            return a.getName().compareToIgnoreCase(b.getName());
        }
    /*************************************************************/
    Hero[] heros = new Hero[]{
                    new Hero("ASDF3", 12, 12),
                    new Hero("ASDF2", 12, 12),
                    new Hero("ASDF", 12, 12),
                    new Hero("ASDF", 12, 12)
            };
    /*從小到大排序*/
    //匿名類
    Arrays.sort(heros, new Comparator<Hero>() {
        @Override
        public int compare(Hero o1, Hero o2) {
            return o1.getName().compareTo(o2.getName());
        }
    });
    //Lambda表示式
    Arrays.sort(heros, (Hero o1, Hero o2) -> {
        return o1.getName().compareTo(o2.getName());
    });
    //方法引用
    Arrays.sort(heros, Hero::compareByName);
    Arrays.stream(heros).forEach(System.out::println);
    
  4. Stream流操作

    具體可以見學習連結:https://how2j.cn/k/lambda/lambda-lamdba-tutorials/697.html

    昨天的非同步Stream也包含在這裡面:https://www.cnblogs.com/meditation5201314/p/13647538.html

    String[] strings = new String[]{"asdf", "fsdfa", "asdff"};
    Arrays.stream(strings).filter(s -> s.startsWith("a")).forEach(System.out::println);
            Arrays.stream(strings).map(String::toUpperCase).sorted((a, b) -> a.compareTo(b)).forEach(System.out::println);
            System.out.println(Arrays.stream(strings).allMatch(s -> s.startsWith("a")));
            System.out.println(Arrays.stream(strings).filter(s -> s.startsWith("a")).count());
    
  5. Optional

            Optional<String> reduced = Arrays.stream(strings).sorted().reduce((s1, s2) -> s1 + "$" + s2);
            reduced.ifPresent(System.out::println);
    
      Hero hero = new Hero();
            Hero newHero = new Hero();
            newHero.setName("這是新Hero");
    
            Optional<Hero> heroOptional = Optional.ofNullable(hero);
            heroOptional.ifPresent(System.out::println);    //不為空就輸出
            System.out.println(heroOptional.orElse(newHero));   //不為空就原樣輸出,為空就輸出新的
            System.out.println(heroOptional.orElseGet(()->functionReturn()));   //不為空就原樣輸出,為空就輸出函式返回值
            System.out.println("========");
            System.out.println(heroOptional.map(hero1 -> hero1.getName()).map(name-> name.toUpperCase()).orElse("asdf"));       //迴圈檢查
    

  6. Base64

    public class Base64 {
        public static void main(String[] args){
            final String text = "Base64 finally in Java 8!";
            final String encoded = java.util.Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8));
            System.out.println(encoded);
            final String decoded = new String(java.util.Base64.getDecoder().decode(encoded), StandardCharsets.UTF_8);
            System.out.println(decoded);
        }
    }
    
  7. 其他

    HashMap引入紅黑樹,效能得到優化(之前一直以為都有紅黑樹,結果是java8引入的)

    Io/Nio

    遍歷當前目錄的檔案和目錄

    Files.list(new File(".").toPath()).forEach(System.out::println);