多くの新機能がプロジェクトで使用されていないので、彼は会社のJava環境のアップグレードプロセスの前に数ヶ月かかりましたし、プロジェクト内の新しい構文java8プロパティを使用して開始するようにサーバーの前に同社は、jdk1.7環境java8を使用されているため。新機能はジャンクコードが表示さの大半を引き起こして、迷惑な会社のプロジェクトで使用することはできませんので、彼のオープンソースプロジェクトの前に要約されているラムダ式への機会を活用して、jdk1.8を使用しています。
なぜランバダ式
白はあなたが何をしたいのより直接的な表現することができ、無名関数であることをラムダ式
簡単な例では、最終用途ラムダ式を達成するために横断する最も原始的で、簡単に美しく、シンプルなラムダ式を見つけることができます。
そこ生徒データの収集、および処理されるべきこれらのデータの必要性は、今あるし、必要なデータをフィルタリング
需要:
1、約30の学生の年齢をチェックしてください
2、18000.99よりも大きいの授業料をチェック
package com.weather.spring.cloud.initializrstart.dao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @program: msa-weather-master
* @description:
* @author: W.HL
* @create: 2019-04-24 20:33
**/
public @Data class Student
{
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private int age;
/**
* 学费
*/
private BigDecimal studyFee;
}
データセットの初期化
@Slf4j
public class LambdaTest
{
private static final int ageLit = 30;
private static final BigDecimal feeLit = new BigDecimal("18000.99");
List<Student> list = Arrays.asList(
new Student("赵敏",18,new BigDecimal("15000.11"))
,new Student("张无忌",20,new BigDecimal("16000.99"))
,new Student("周芷若",25,new BigDecimal("18000.99"))
,new Student("小昭",40,new BigDecimal("21000.99"))
,new Student("宋青书",50,new BigDecimal("31000.99"))
);
}
ループが元のクエリを使用してフィルタリングするための第一に、
/**
* 根据年龄过滤
* @param list
* @return
*/
public List<Student> filterStudentByAge(List<Student> list){
List<Student> resultList = new ArrayList<>();
for (Student student : list){
if(student.getAge()>ageLit){
resultList.add(student);
}
}
return resultList;
}
/**
* 根据学费过滤
* @param list
* @return
*/
public List<Student> filterStudentByFee(List<Student> list){
List<Student> resultList = new ArrayList<>();
for (Student student : list){
if(student.getStudyFee().compareTo(feeLit)>0){
resultList.add(student);
}
}
return resultList;
}
@Test
public void test(){
/*获取年龄大于30的学生*/
List<Student> list_1 = filterStudentByAge(list);
log.info("当前年龄大于30的学生有:{}",list_1.toString());
log.info("----------------------------------");
/*获取学费大于18000的学生*/
List<Student> list_2 = filterStudentByFee(list);
log.info("当前学费大大于18000.99元的学生有:{}",list_2.toString());
}
冗長なコードの多くを発見し、使用して最適化モードでの戦略を最適化するために、
第二に、最適化プログラム:最適化するために、モードによって使用ポリシー
package com.weather.spring.cloud.initializrstart.service;
/**
* @program: msa-weather-master
* @description: This is a filer for student and return list
* @author: W.HL
* @create: 2019-04-24 20:59
**/
@FunctionalInterface
public interface FilterStudent<T>
{
boolean filterByCond(T t);
default void filterByCond3(T t){
System.out.println(t);
};
}
package com.weather.spring.cloud.initializrstart.service;
import com.weather.spring.cloud.initializrstart.dao.Student;
/**
* @program: msa-weather-master
* @description: This is filter student by age
* @author: W.HL
* @create: 2019-04-24 21:02
**/
public class FilterAgeStudentImpl implements FilterStudent<Student>
{
private static final int ageLit = 40;
@Override
public boolean filterByCond(Student student)
{
return student.getAge()>ageLit?true:false;
}
}
package com.weather.spring.cloud.initializrstart.service;
import com.weather.spring.cloud.initializrstart.dao.Student;
import java.math.BigDecimal;
/**
* @program: msa-weather-master
* @description: This is filter student by fee
* @author: W.HL
* @create: 2019-04-24 21:02
**/
public class FilterFeeStudentImpl implements FilterStudent<Student>
{
private static final BigDecimal feeLit = new BigDecimal("18000.99");
@Override
public boolean filterByCond(Student student)
{
return student.getStudyFee().compareTo(feeLit)>1?true:false;
}
}
対応する試験方法を準備するために、実装クラス料金をフィルタリングインターフェースを使用して、年齢による別のフィルタの実装クラスを作成し、濾過し、異なる実装クラスを渡すことによって、異なる条件によってフィルタに実装され、それに基づいて、元のコードを変更せずに濾過によって拡張することができます。
/**
* 优化一 使用策略者模式
*/
@Test
public void test1(){
/*获取年龄大于30的学生*/
List<Student> list_3 = filterByCond(list,new FilterAgeStudentImpl());
log.info("当前年龄大于30的学生有:{}",list_3.toString());
log.info("----------------------------------");
/*获取学费大于18000的学生*/
List<Student> list_4 = filterByCond(list,new FilterFeeStudentImpl());
log.info("当前学费大大于18000.99元的学生有:{}",list_4.toString());
}
public List<Student> filterByCond(List<Student> list,FilterStudent<Student> filterStudent){
List<Student> list_1 = new ArrayList<>();
for (Student student: list){
if(filterStudent.filterByCond(student)){
list_1.add(student);
}
}
return list_1;
}
第三に、最適化2:使用ラムダ式処理
/**
* 优化二 使用Lambda 表达式进行处理
*/
@Test
public void test2(){
/*获取年龄大于30的学生*/
List<Student> list_3 = filterByCond(list,(s) -> s.getAge()<=ageLit);
log.info("当前年龄大于30的学生有:{}",list_3.toString());
log.info("----------------------------------");
/*获取学费大于18000的学生*/
List<Student> list_4 = filterByCond(list,(s) -> s.getStudyFee().compareTo(feeLit)>0);
log.info("当前学费大于18000.99元的学生有:{}",list_4.toString());
}
おそらくかなりそれが何を意味するのか理解できないことがあり、あなたが細部のデバッグエンドポイントを使用することができ、あなたは無名関数の機能を実行しないラムダ式の内容を見ることができ、実際に具体的な実装クラスを使用していない下のチャートから、中括弧を行っています条件をフィルタリングする場合に直接濾過によって達成しました。
第四に、最適化プログラム3:使用ストリームラムダ式を処理し、ソート処理
/**
* 优化三 使用Lambda stream表达式进行处理
*/
@Test
public void test3(){
/*获取年龄大于30的学生 并按照年龄倒叙*/
List<Student> list_3 = list.stream()
.filter((e)>e.getAge()>ageLit)
.sorted(Comparator.comparing(Student::getAge).reversed())
.collect(Collectors.toList());
log.info("当前年龄大于30的学生有:{}",list_3.toString());
log.info("----------------------------------");
/*获取学费大于18000的学生*/
List<Student> list_4 = list.stream()
.filter((e)->e.getStudyFee().compareTo(feeLit)>0)
.collect(Collectors.toList());
log.info("当前学费大于18000.99元的学生有:{}",list_4.toString());
}
需要の変化:ちょうど(地図を与えられたアプリケーションの構成の結果で返されたデータストリームをフィルタ)30とされていない他のデータよりも年下の学生の授業料をチェック
/**
* 只获取年龄小于30的学生的学费
*/
@Test
public void test4(){
/*获取年龄大于30的学生*/
list.stream().filter(e->e.getAge()<30).map(e->e.getStudyFee()).forEach(e-> System.out.println(e));
log.info("----------------------------------");
}
フィルタリングデータの面でラムダ式は明らかに、元の10行から出てくる必要があるが、今はほぼ限り、両方の完全なラインとして、ジャンクコードの多くを軽減していることを上記のコードから見ることができます
ラムダ構文の要約:
jdk1.8の使用「 - >」演算子は、式の演算子が2つの部分に分かれて使用して、オペレータまたはオペレータ矢印ラムダと呼ばれています。
ラムダ式の引数リスト:左側に
右:(また、関数インタフェースの具体的な方法として知られている)機能を実行ラムダ式
インターフェイスメソッドのパラメータの概要
パラメータと戻り値または
パラメータなし戻り値なし | |
パラメータは、戻り値(持つ括弧内の左側には、省略することはできません) | |
戻り値を持つ複数のパラメータは、(ラムダ体は、唯一のステートメント、リターンであり、括弧を省略することができます) | |
引数の型ラムダパラメータリストで指定されたコンテキストは、パラメータの型を省略することができた場合、JVMは自動的にコンテキスト識別パラメータの種類に基づいてます | |
機能:インタフェース@FunctionalInterfaceは注釈のみ抽象メソッドを含めることができますが、同じ時間を変更するための複数のデフォルトの方法よりも含まれていてもよい追加し、実装クラスを変更するためのデフォルトの方法では実装しないことを選択することができますが、それでも、直接使用呼び出すことができます
@FunctionalInterface
public interface FilterStudent<T>
{
boolean filterByCond(T t);
// 如果在创建一个抽象接口 例如:boolean filterByCond5(T t);则会报错
default void filterByCond3(T t){
System.out.println(t);
};
}
たとえば、私たちの最も人気のあるコンパレータ<T>、Runable、消費者<T>の多くは、とそうjava8の前にあります