Java 8新機能まとめ
45733 ワード
かんすうしきプログラミング
演算プロセスを関数にカプセル化し,関数呼び出しにより対応する機能を実現する
関数インタフェース
インタフェースに抽象的なメソッドが1つしか含まれていないインタフェースを関数インタフェースと呼ぶ
JAva 8の新しい関数インタフェースはjavaにあります.util.funtionパッケージでよく使われるのは以下の通りです.
default:インタフェースではdefaultキーワードを使用して、インタフェースにデフォルトのメソッドの実装を含ませることができます.このような設計は、互換性と拡張のために、1つのインタフェースが万以上のクラス実装され、インタフェースに抽象的なメソッドを追加すると、万以上のクラスが変更されますが、defaultメソッドでこれらのクラスを変更する必要はありません.シームレスな拡張機能を実現することができる.
Lambda式
コードの作成をより速く、より優雅にするためのプロパティ構文は、次のとおりです.
関数インタフェースを使用する場所でlambda式を使用することができます.関数インタフェースには抽象的な方法が1つしかないので、方法のパラメータタイプを決定することができます.->後に続くのはパラメータに対する操作です.
匿名の内部クラスとlambdaの比較を使用する
パラメータ付き戻り値付き
注意:関数インタフェースは1つの入力カッコで省略でき、1つの文のカッコで省略できます.戻り値付きインタフェースは、1つの文だけが値を返す場合は省略できます.
Stream
コレクションの操作が容易
演算プロセスを関数にカプセル化し,関数呼び出しにより対応する機能を実現する
//
Integer result=(a+b)*c-d;
//
Integer result = subtract(multiply(add(a,b), c), d);
関数インタフェース
インタフェースに抽象的なメソッドが1つしか含まれていないインタフェースを関数インタフェースと呼ぶ
JAva 8の新しい関数インタフェースはjavaにあります.util.funtionパッケージでよく使われるのは以下の通りです.
BiConsumer<T,U> //
BiFuction<T,U,R> // ,
Consumer<T> //
default:インタフェースではdefaultキーワードを使用して、インタフェースにデフォルトのメソッドの実装を含ませることができます.このような設計は、互換性と拡張のために、1つのインタフェースが万以上のクラス実装され、インタフェースに抽象的なメソッドを追加すると、万以上のクラスが変更されますが、defaultメソッドでこれらのクラスを変更する必要はありません.シームレスな拡張機能を実現することができる.
Lambda式
コードの作成をより速く、より優雅にするためのプロパティ構文は、次のとおりです.
(arg1,arg2)->{ // }
関数インタフェースを使用する場所でlambda式を使用することができます.関数インタフェースには抽象的な方法が1つしかないので、方法のパラメータタイプを決定することができます.->後に続くのはパラメータに対する操作です.
匿名の内部クラスとlambdaの比較を使用する
@FunctionalInterface
public interface MyInterface {
void m1();
}
// labmda ,
MyInterface myInterface = new MyInterface() {
@Override
public void m1() {
System.out.println("no lambda");
}
};
myInterface.m1();
// use lambda
MyInterface myInterface1 = () -> System.out.println("lambda!");
myInterface1.m1();
パラメータ付き戻り値付き
public interface MyInterfaceWithParam {
int sum(int a,int b);
}
MyInterfaceWithParam param = (a, b) -> a + b; // return
System.out.println(param.sum(1, 2));
注意:関数インタフェースは1つの入力カッコで省略でき、1つの文のカッコで省略できます.戻り値付きインタフェースは、1つの文だけが値を返す場合は省略できます.
Stream
コレクションの操作が容易
public class Student {
private String name;
private Integer score;
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
public Student(String name, Integer score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}
public class InitData {
public static List<Student> getList(){
List<Student> stuList = new ArrayList<>(10);
stuList.add(new Student(" ", 85));
stuList.add(new Student(" ", 90));
stuList.add(new Student(" ", 98));
stuList.add(new Student(" ", 88));
stuList.add(new Student(" ", 83));
stuList.add(new Student(" ", 95));
stuList.add(new Student(" ", 87));
stuList.add(new Student(" ", 84));
stuList.add(new Student(" ", 100));
stuList.add(new Student(" ", 95));
return stuList;
}
}
List<Student> list=InitData.getList();
public static void main(String[] args) {
List<Student> list=InitData.getList();
// 90
List<Student> result=new ArrayList<>(10);
for (Student s:stuList){
if (s.getScore()>=90){
result.add(s);
}
}
result.sort((s1,s2)->Integer.compare(s2.getScore(),s1.getScore()));
System.out.println(result);
// stream
result=stuList.stream()
.filter(student -> student.getScore()>=90)
// .sorted((s1,s2)->Integer.compare(s2.getScore(),s1.getScore()))
.sorted(Comparator.comparing(Student::getScore).reversed())
.collect(Collectors.toList());
System.out.println(result);
}
// stream
public static void main(String[] args) {
List<Student> list=InitData.getList();
Stream<Student>studentStream= list.stream();
studentStream.forEach(System.out::println);
studentStream.forEach(System.out::println); //
}
public static void main(String[] args) {
List<Student> list=InitData.getList();
// map
List<Integer> scoreList=list.stream()
.map(Student::getScore)
.collect(Collectors.toList());
System.out.println(scoreList);
// map
List<Integer> len=list.stream()
.map(Student::getName)
.map(String ::length)
.collect(Collectors.toList());
System.out.println(len);
// -10
List<Integer> score10List=list.stream()
.map(Student::getScore)
.map(integer -> integer-10)
.collect(Collectors.toList());
System.out.println(score10List);
//
int count=list.stream()
.map(Student::getScore)
.reduce(0,(a,b)->a+b);
System.out.println(count);
//
Optional<Integer> count1=list.stream()
.map(Student::getScore)
.reduce((a,b)->a+b);
System.out.println(count1.get());
//
Optional<Integer> max=list.stream()
.map(Student::getScore)
.reduce(Integer::max);
System.out.println(max.get());
//
Optional<Integer> min=list.stream()
.map(Student::getScore)
.reduce(Integer::min);
System.out.println(min.get());
// list.stream().reduce(Comparator.comparing())
}
public static void main(String[] args) {
List<Student> list = InitData.getList();
int sum = list.stream().mapToInt(Student::getScore).sum();
System.out.println(sum);
//
OptionalDouble avg = list.stream().mapToInt(Student::getScore).average();
System.out.println(avg.getAsDouble());
//
IntStream is = IntStream.rangeClosed(1, 100);// closed
// 1-100
long l= IntStream.rangeClosed(1, 100)
.filter(s -> s % 2 == 0)
.count();
System.out.println(l);
}
public static void main(String[] args) {
// stream of
String[] arr = {"i", "love", "this", "game"};
Stream.of(arr).map(String::toUpperCase).forEach(System.out::println);
// Arrays.stream
int[] nums = {2, 3, 7, 5};
int a = Arrays.stream(nums).sum();
System.out.println(a);
// , 10
Stream.iterate(0,n -> n + 2).limit(10).forEach(System.out::println);
}