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表現を使用するとコードをより簡潔でコンパクトにすることができます。
ラダ式を使うときの注意点
一つのインターフェースが抽象的な方法しかない場合、このインターフェースは関数式インターフェースと呼ばれ、関数式インターフェースは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タイプを返します。
方法引用はラボラダの簡単な書き方です。lambankda表式が特定の既存の方法を呼び出すだけであれば、メソッド参照を使用することができます。オブジェクト:例示的方法 類:静的方法 クラス:例示的な方法 類:new
Streamはjava 8における配列処理、集合の抽象概念であり、集合の動作を指定することができます。非常に複雑な検索、フィルタリング、マッピングデータなどの操作ができます。Stream APIを使用して、集合を動作させることは、SQLを使用して実行されるデータベースクエリと同様である。stream APIを使って並列に動作することもできます。 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
旧バージョンの時間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つのフォーマットの方法を提供しています。事前に定義された標準書式言語環境に関するフォーマットのカスタムフォーマットです。
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表式が特定の既存の方法を呼び出すだけであれば、メソッド参照を使用することができます。
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つのステップ: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 8はjava.timeパッケージに多くの新しいAPIを提供しています。以下は二つの比較的に重要なAPIです。
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);
}
}