什麼是lambda
Lambda 容許把函數做爲一個方法的參數,使用 Lambda 表達式能夠使代碼變的更加簡潔緊湊。java
lambda格式
method(param->表達式); //或者 method(param->{ 語句塊; });
示例
List<String> list=Lists.newArrayList(); list.add("jack"); list.add("test"); //表達式示例:判斷是否有匹配 boolean match=list.stream().anyMatch(item->item.equals("test")); //語句塊示例:循環 list.stream().forEach(item->{ String sayHi="hi,"+item; System.out.println(sayHi); });
多線程示例
接下來咱們看一下使用lambda方式新建線程。
普通新建一個線程:多線程
new Thread(new Runnable() { @Override public void run() { System.out.println("do something"); } }).start();
使用lambda方式:ide
new Thread(() -> System.out.println("do something")).start();
能夠看出使用lambda會使代碼更加簡潔優美。函數
集合循環
普通集合循環:線程
List<String> names = Lists.newArrayList(); for (String name : list) { System.out.println(name); }
使用lambda方式:3d
names.stream().forEach(name-> System.out.println(name));
Collection接口的stream方法
集合下的stream方法有多種用處,下面舉幾個經常使用的例子:指針
集合循環
list.stream().forEach(item->{.....})
Map循環
notExistsSchool.entrySet().stream().forEach(item -> { dosomething });
List過濾
根據條件過濾,並返回一個新的集合code
list=list.stream().filter(item->{ return item.equals("test")?false:true; }).collect(Collectors.toList());
list轉換成map-value覆蓋
//key是屬性,value是對象 Map<Long, User> entityMap= userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(entity1,entity2) -> entity1)); //key是屬性,value也是屬性 Map<String ,String > grandClass=dataList.stream().collect(Collectors.toMap(User::getUserId, User::getUserName,(entity1,entity2) -> entity1));
list轉換成map-value合併
list對象中的一個屬性做爲key,相同的key合併成一個集合。對象
- 定義entity:
public class StudentEntity { private String className; private String studentName; }
- 進行轉換:
Map<String, List<StudentEntity>> stuMap = stuList.stream().collect(Collectors.toMap( //對key的處理方式,此處返回className StudentEntity::getClassName, //對value的處理方式,轉換成一個集合 stu -> { List<StudentEntity> list = new ArrayList<>(); list.add(stu); return list; }, //對重複的key進行的操做,進行合併 (oldList, newList) -> { oldList.addAll(newList); return oldList; } ));
map轉換list
List<Long> list= roomMap.entrySet().stream().map(item ->item.getValue()).collect(Collectors.toList());
集合去重-屬性
集合中存放的是對象,根據對象屬性去重blog
List<String> gradeCodes = dataList.stream().map(ExcelStuBean::getGradeCode).distinct().collect(Collectors.toList());
集合去重-對象
若是集合中存在多個屬性相同的對象,去重須要重寫equals和hashcode方法。
//Test須要重寫equals和hashcode方法 Test test0 = new Test("海淀一小", "一年級", "jack"); Test test1 = new Test("海淀一小", "一年級", "jack"); Test test2 = new Test("海淀一小", "一年級", "tom"); Test test3 = new Test("海淀一小", "二年級", "ahuang"); List<Test> list = Lists.newArrayList(); list.add(test0); list.add(test1); list.add(test2); list.add(test3); List<Test> distinctList = list.stream().map(stu -> { return stu; }).distinct().collect(Collectors.toList()); distinctList.stream().forEach(item -> { System.out.println(JSONObject.toJSONString(item)); });
輸出信息以下:
集合分組
Test test1 = new Test("海淀一小","一年級","jack"); Test test2 = new Test("海淀一小","一年級","tom"); Test test3 = new Test("海淀一小","二年級","ahuang"); List<Test> list=Lists.newArrayList(); list.add(test1); list.add(test2); list.add(test3); Map<String, List<Test>> collect = list.stream().collect(Collectors.groupingBy(Test::getClassName)); collect.forEach((key,value)->{ System.out.println(key+": "+ JSONObject.toJSONString(value)); });
集合分組求和
在上面的"集合分組"例子中,咱們在Test對象裏面加入一個int類型的屬性count,以表示求和結果。
//單個屬性分組 Map<String, IntSummaryStatistics> collect2 = list.stream().collect (Collectors.groupingBy(Test::getClassName, Collectors.summarizingInt(Test::getCount))); collect2.forEach((key,value)->{ System.out.println(key+": "+ JSONObject.toJSONString(value)); });
輸出信息以下:
//多個屬性分組 Map<String, IntSummaryStatistics> collect3= list.stream().collect (Collectors.groupingBy(item->{ return item.getSchoolName()+"-"+item.getClassName(); }, Collectors.summarizingInt(Test::getCount))); collect3.forEach((key,value)->{ System.out.println(key+": "+ JSONObject.toJSONString(value)); });
輸出信息以下:
成員屬性求sum
BigDecimal reduce = pList.stream().map(Person::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add); System.out.println("工資總計:" + reduce);
屬性判斷
//任意一個匹配 data.stream().anyMatch(item->item.getCity().equals("北京")); //所有匹配 data.stream().allMatch(item->item.getCity().equals("北京"));
成員查找
//查找第一個 Optional<String> result = list.stream().findFirst(); //查找任意一個 Optional<String> result = list.stream().findAny();
LIST查詢屬性集合
map接口接收一個值,並返回一個值。
List<Long> ids = data.stream().map(Student::getId()).collect(Collectors.toList()); //此寫法等同於 List<Long> ids = data.stream().map(student->student.getId()).collect(Collectors.toList());
排序
//正排序 regions = regions.stream().sorted(Comparator.comparingInt(HomeworkWkRegion::getMarkingSort)).collect(Collectors.toList()); //倒排序 regions = regions.stream().sorted(Comparator.comparingInt(HomeworkWkRegion::getMarkingSort).reversed()).collect(Collectors.toList());
求最大值
經過reduce計算,好比說我須要求出學生信息中最高分。
//接上面的信息map,咱們改寫成求最大分數 Optional<Integer> maxScore=data.stream().map(Student::getScore()).reduce(Integer::max); //此寫法等同於 int maxScore=data.stream().map(Student::getScore()).reduce(Integer::max).orElse(0);
注意reduce返回的是Optional類型,這是java8中新添加的,主要是防止空指針。
strem缺點
- 沒法中斷循環
- 代碼異常沒法定位到匿名內部類中具體行數