java 1.8の新しい特性

15693 ワード

java 1.8の新しい特性
  • Lambada表現
  • メソッド参照
  • Stream API
  • 新しい日時API Java 8(jdk 1.8ともいう)はJava言語の開発の主要なバージョンである。Oracleは2014年3月18日にJava 8を発表しました。関数式プログラミング、新しいJavaScriptエンジン、新しい日付API、新しいStream APIなどをサポートしています。
  • Lamban表現−Lambadaは、パラメータ伝達方法として関数をパラメータとして使用することを可能にする。
  • 方法は、既存のJavaクラスまたはオブジェクト(例)を直接参照することができる−方法参照は、非常に有用なシンタックスを提供する。lambankaと共同で使用すると、方法引用は言語の構造をよりコンパクトにし、冗長コードを減らすことができます。
  • デフォルトの方法−デフォルトの方法は、インターフェース内で実現される方法である。
  • Stream API−新たに追加されたStream API(java.util.stream)は、本物の関数式プログラミングスタイルをJavaに導入する。
  • Date Time API−は、日付と時間の処理を強化する。
  • Optional類−Optional類はすでにJava 8クラスの一部となり、空の指針異常を解決するために用いられています。
  • Nashorn、JavaScriptエンジン−Java 8は新しいNashan javascriptエンジンを提供しています。JVMで特定のjavascriptアプリケーションを実行することができます。
  • ラボンダ式
    Lamber表現は匿名の内部クラスと見なされ、Lamberは関数を一つの方法のパラメータ(関数を方法のパラメータとする)として使用し、コードをデータのように伝達し、Lamber表現を使用するとコードをより簡潔でコンパクトにすることができます。
    ラダ式を使うときの注意点
         ->      
                  
                ()
            ,   ()  ,
              ,     ,{}    ,     ,   {}       return,            
    lambda             
    lambda           ,        final ,         final   ,        ,            
    
    関数インターフェース
    一つのインターフェースが抽象的な方法しかない場合、このインターフェースは関数式インターフェースと呼ばれ、関数式インターフェースはlamda式を使用でき、lamda式はこの抽象的な方法でマッチングされます。
    あなたの各インターフェースが必ずこの要求に達するようにするために、インターフェースに@Functionallenter faceの注釈を追加するだけで、コンパイラは自動的にあなたのために検査します。
    関数インターフェース
    パラメータの種類
    タイプを返します
    説明
    Consmer消費型インターフェース
    T
    void
    void accept(T t)タイプTのオブジェクトに動作を適用します。
    Supplier供給型コネクタ
    なし
    T
    T get()タイプTのオブジェクトを返します。
    Function関数型インターフェース
    T
    R
    Rアプリ(T t)タイプTのオブジェクトに動作を適用し、タイプRのオブジェクトを返します。
    Prodcate断言型インターフェース
    T
    bollan
    bollan test(T t)Tタイプのオブジェクトが条件を満たしているかどうかを判定し、bollanタイプを返します。
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.function.Consumer;
    import java.util.function.Function;
    import java.util.function.Predicate;
    import java.util.function.Supplier;
    
    /*
     * created by     in 2019/8/21/021 at 8:09
     * lambda      (         )
     * Consumer               
     * Supplier               
     * Function          T    R
     * Predicate          ,    boolean 
     */
    public class Demo2 {
        public static void main(String[] args) {
            happy(1000,
                    m-> System.out.println("      "+m)
            );
            happy(1000,m->System.out.print("  "+m));
            List nums=getNumbers(10,
                ()-> new Random().nextInt(100)
            );
            for (Integer num : nums) {
                System.out.println(num);
            }
            System.out.println(stringOpe("hello",
                    s-> s.toUpperCase()));
            System.out.println(stringOpe("Wo", s->s.toLowerCase()));
    
            List names=new ArrayList<>();
            names.add("  ");
            names.add("  ");
            names.add("  ");
            names.add("  ");
            List list=filterString(names,
                    s-> s.startsWith(" "));
            List list1=filterString(names,s->s.equals("  "));
            for (String s : list1) {
                System.out.println(s);
            }
        }
    
    
        //     
        public static void happy(double money, Consumer consumer){
            consumer.accept(money);
        }
    
        //     
        public static List getNumbers(int count, Supplier supplier){
            List list=new ArrayList<>();
            for (int i = 0; i  function){
            return function.apply(s);
        }
    
        //     
        public static List filterString(List list, Predicate predicate){
            List list1=new ArrayList<>();
            for (String s : list) {
                if(predicate.test(s)){
                    list1.add(s);
                }
            }
            return list1;
        }
    
    }
    
    
    メソッド参照
    方法引用はラボラダの簡単な書き方です。lambankda表式が特定の既存の方法を呼び出すだけであれば、メソッド参照を使用することができます。
  • オブジェクト:例示的方法
  • 類:静的方法
  • クラス:例示的な方法
  • 類:new
  • import java.util.Comparator;
    import java.util.TreeSet;
    import java.util.function.BiPredicate;
    import java.util.function.Consumer;
    import java.util.function.Supplier;
    
    /*
     * created by     in 2019/8/21/021 at 22:21
     *     :  lambda                       ,         
     *   ::    
     *  ::    
     *  ::    
     *  ::new
     *
     */
    public class Demo3 {
        public static void main(String[] args) {
            //       ::   
            Consumer con=s-> System.out.println(s);
            //   
            Consumer con1=System.out::println;
            con.accept("hello");
            con1.accept("world");
    
            //  ::    
            Comparator comparator=(x,y)->Integer.compare(x, y);
            Comparator comparator1=Integer::compare;
            TreeSet treeSet=new TreeSet<>(comparator1);
    
            //  ::     
            BiPredicate bpre=(x,y)->x.equals(y);
            BiPredicate bpre1=String::equals;
    
            //      :
    //        Supplier sup3=()->new Employee();
    //        Supplier sup4=Employee::new;
        }
    }
    
    
    Stream APIを理解する
    Streamはjava 8における配列処理、集合の抽象概念であり、集合の動作を指定することができます。非常に複雑な検索、フィルタリング、マッピングデータなどの操作ができます。Stream APIを使用して、集合を動作させることは、SQLを使用して実行されるデータベースクエリと同様である。stream APIを使って並列に動作することもできます。
    Stream API  :
    	Stream         
    	Stream       ,  ,             Stream
    	Stream        ,                    
    Stream  “          ”   。          ,             。
    
    Streamを使用する3つのステップ:
  • Streamを作成します。
  • は、1つまたは複数のステップにおいて、初期化Streamを他のStreamの中間動作(中間動作)
  • に変換する。
  • は、終了動作を使用して結果を生成する。この操作は彼に直前の遅延操作を強制的に実行させます。その後、Streamは使われなくなりました。(終了操作)
  • Streamの中間操作:
    map、filter、distinct、sorted、peek、limit、skyp、parallel、sequential、unordedを含みます。
    複数の中間操作は流れ線上で終端操作がトリガされない限り、中間操作は実行されないが、動作終了時に一括処理することを「不活性値」と呼ぶ。
    終了操作:
    forEach forEachOrdered toray rreuce collect min max count anyMatch allMatch noneMatch findFirst findAny iterator
    import java.util.*;
    import java.util.function.Consumer;
    import java.util.function.Function;
    import java.util.function.Predicate;
    import java.util.function.UnaryOperator;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    /*
     * created by     in 2019/8/22/022 at 11:23
     */
    public class Demo5 {
        /*public static void main(String[] args) {
            //Stream     
            //Stream.of  
            Stream stream=Stream.of("a","b","c");
            //Arrays.stream  
            String[] arr=new String[]{"a","b","c"};
            stream =Stream.of(arr);
            stream= Arrays.stream(arr);
            //    
            List list=Arrays.asList(arr);
            stream=list.stream();
            stream=list.parallelStream();//   
            //     
            //  
            Stream stream1=Stream.iterate(0, x->x+2);
            stream1.limit(10).forEach(System.out::println);
            //  
            Streamstream2=Stream.generate(()->Math.random());
            stream2.limit(5).forEach(System.out::println);
        }*/
    
    
        public static void main(String[] args) {
            List employees=new ArrayList<>();
            employees.add(new Employee("xxx",30,1000," "));
            employees.add(new Employee("yyy",20,3000," "));
            employees.add(new Employee("zzz",23,1200," "));
            employees.add(new Employee("  ",42,2000," "));
            employees.add(new Employee("  ",19,1900," "));
            employees.add(new Employee("  ",19,1900," "));
    
            //     
            System.out.println("--------filter  ------");
            Stream stream=employees.stream()
                    .filter(e->e.getAge()>25);
            stream.forEach(System.out::println);
            System.out.println("---------limit    -----------");
            Stream stream1=employees.stream().limit(3);
            stream1.forEach(System.out::println);
            System.out.println("---------skip    ,        n     -----------");
            Stream stream3=employees.stream().skip(2);
            stream3.forEach(System.out::println);
            System.out.println("---------distinct           equals()      -----------");
            Stream stream4=employees.stream().distinct();
            stream4.forEach(System.out::println);
    
            //  map--  Lambda
            //               。          ,             ,            
            System.out.println("-------      --------");
            Stream str=employees.stream().map(e->e.getName());
            str.forEach(System.out::println);
            System.out.println("------     -------");
            List list=Arrays.asList("aaa","bbb","ccc","ddd");
            Stream stream2=list.stream().map(String::toUpperCase);
            stream2.forEach(System.out::println);
            //  
            /*
            * sorted()---    
            * sorted(Comparator com)----    
            * */
            System.out.println("------sorted()    --------");
            employees.stream().map(Employee::getName)
                    .sorted()
                    .forEach(System.out::println);
            System.out.println("    ");
            employees.stream().sorted((x,y)-> {
                    if(x.getAge()==y.getAge()){
                        return x.getName().compareTo(y.getName());
                    }else{
                        return Integer.compare(x.getAge(),y.getAge() );
                    }
                }
            ).forEach(System.out::println);
            //
            System.out.println("---------foreach------------");
            employees.stream().forEach(System.out::println);
            /*
            * allMatch---          
            * anyMatch---            
            * noneMatch---           
            *findFirst---       
            * findAny----           ,      
            * count----          
            * max----        
            * min----       
            * */
            boolean b = employees.stream().allMatch(e -> e.getSex().equals(" "));
            boolean b1=employees.stream().anyMatch(e->e.getSex().equals(" "));
            boolean b2=employees.stream().noneMatch(e->e.getSex().equals(" "));//         true
            System.out.println(b);
            System.out.println(b1);
            System.out.println(b2);
            Optional first = employees.stream().findFirst();
            Optional any = employees.stream().findAny();
            System.out.println(first.get());
            System.out.println(any.get());
            Optional max=employees.stream().max((o1,o2)->o1.getAge()-o2.getAge());
            System.out.println(max.get());
            Optional min=employees.stream().map(Employee::getSalary).min(Double::compareTo);
            System.out.println(min.get());
            //     
            /*
            * reduce    reduce(T identity, BinaryOperator)/reduce(BinaryOperator)
            *               ,     
            * */
            List list1=Arrays.asList(1,2,3,4,5,6,7,8,9,10);
            Integer sum=list1.stream().reduce(0,(x,y)->x+y );//         ,       
            System.out.println(sum);
            System.out.println("--------------------");
            Optional op = employees.stream().map(Employee::getSalary).reduce(Double::sum);
            System.out.println(op.get());
            /*
            * collect---         ,    Collector     ,   Stream          
            *
            * */
            List list2 = employees.stream().map(Employee::getName).collect(Collectors.toList());
            list2.forEach(System.out::println);
            System.out.println("--------Set  ----------");
            Set set = employees.stream().map(Employee::getName).collect(Collectors.toSet());
            set.forEach(System.out::println);
        }
    
    
    }
    
    
    新しい日時を理解するAPI
    旧バージョンの時間APIに存在する問題:
  • 非スレッドセキュリティ-java.util.Dateは非スレッドセキュリティであり、すべての日付クラスは可変であり、これはjava日付クラスの最大の問題の一つである
  • 設計の差ーjavaの日付時間類の定義は一致していません。utilとsqlカバンの中には日付類があります。ここでフォーマットと解析に使うクラスはjava.textパッケージで定義されています。java.util.Dateは日付と時間を同時に含んでいますが、java.sql.Dateは日付だけを含んでいます。java.sqlカバンに入れるのは不合理です。また、この二つは同じ名前を持っています。それ自体が悪いデザインです。
  • タイムゾーンの処理は面倒です。日付は国際化を提供しません。タイムゾーンのサポートがないので、javaはjava.util.Calendarとjava.util.TimeZone類を導入しました。しかし、彼らは同様に上述のすべての問題が存在します。
    java 8はjava.timeパッケージに多くの新しいAPIを提供しています。以下は二つの比較的に重要なAPIです。
  • Local(ローカル)は日付時間の処理を簡略化しました。タイムゾーンの問題がありません。
  • Zoneld(タイムゾーン)は、カスタマイズされたタイムゾーンによる処理日時
  • LocalDate/Local TimeとLocal DateTime類は、処理時間エリアでは必須ではない場合があります。
    LocalDate、Local Time、Local DateTime類の例は可変の対象ではなく、それぞれISO-801カレンダーシステムを使用する日付、時間、日付と時間を表しています。これらは簡単な日付または時間を提供しており、タイムゾーンに関する情報は含まれていません。
    Instantタイムスタンプは以前のDate、Timestampに似ています。
    Unix元年(UTCタイムゾーンとして伝統的に設定されていた1970年1月1日午前0時)からの記述で演算されます。
    TemporalAdjer:時間校正器。私たちは時々、例えば「次の日曜日」に日付を変更するなどの操作が必要です。TemporalAdjers:このクラスは、静的な方法によって、多くの一般的なTemporalAdjurerの実現を提供しています。
    java.time.format.DateTimeFormater類:このクラスは3つのフォーマットの方法を提供しています。事前に定義された標準書式言語環境に関するフォーマットのカスタムフォーマットです。
    import java.time.Duration;
    import java.time.Instant;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.util.Date;
    
    /*
     * created by     in 2019/8/22/022 at 15:33
     */
    public class Demo7 {
        /*public static void main(String[] args) {
            //    
            LocalDateTime ldt=LocalDateTime.now();
            System.out.println(ldt);
            //    
            LocalDateTime ldt2=LocalDateTime.of(2012,10,1,2,3,4);
            System.out.println(ldt2);
            //   
            LocalDateTime ldt3=ldt2.plusDays(2);
            System.out.println(ldt3);
            //   
            LocalDateTime ldt4=ldt3.minusDays(2);
            System.out.println(ldt4);
            //      
            System.out.println(ldt.getYear());
            System.out.println(ldt.getMonthValue());
            System.out.println(ldt.getDayOfMonth());
            System.out.println(ldt.getHour());
            System.out.println(ldt.getMinute());
            System.out.println(ldt.getSecond());
    
    
        }*/
        public static void main(String[] args) throws Exception{
            //   
            Instant instant=Instant.now();
            System.out.println(instant);
            Thread.sleep(1000);
            Instant instant1=Instant.now();
            long mills= Duration.between(instant, instant1).toMillis();
            System.out.println(mills);
            //  
            System.out.println(ZoneId.getAvailableZoneIds());
            ZoneId zoneId=ZoneId.of("Europe/Berlin");
            ZoneId zoneId2=ZoneId.of("Brazil/East");
            System.out.println(zoneId.getRules());
            System.out.println(zoneId2.getRules());
            System.out.println("-----------Date--Instant---LocalDateTime-------");
            Date date=new Date();
            Instant instant2=date.toInstant();
            LocalDateTime localDateTime = instant2.atZone(ZoneId.systemDefault()).toLocalDateTime();
            System.out.println(localDateTime);
            System.out.println("--------LocalDateTime---Instant----Date--------");
            Instant instant3 = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
            Date date1 = Date.from(instant3);
            System.out.println(date1);
    
        }
    }