最近在做项目的过程中经常会接触到 lambda 表达式,随后发现它基本上可以替代所有 for 循环,包括增强for循环。也就是我认为,绝大部分的for循环都可以用 lambda 表达式改写。
lambda表达式有它自己的优点:(1)简洁,(2)易并行计算。尤其适用于遍历结果,循环计算数值或者赋值的时候非常方便。
缺点: (1)若不用并行计算,很多时候计算速度没有比传统的 for 循环快。
(2)不容易使用debug模式调试。
(3)在 lambda 语句中直接强制类型转换不方便。
(4)不可以在foreach中修改foreach外面的值。
public class Jdk8Main {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
Person p1 = new Person("张1",1,1);
Person p101 = new Person("张101",101,101);
Person p2 = new Person("张2",2,2);
Person p3 = new Person("张3",3,3);
Person p4 = new Person("张4",4,4);
Person p5 = new Person("张5",5,5);
Person p6 = new Person("张6",6,6);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p101);
/**
* 1.forEach()进行遍历集合
* item:可以是任意值。类似于for循环中的循环值
*/
list.forEach(item->{
//设置值
item.setName(item.getName()+"测试");;
//输出语句
System.out.println(item.toString());
});
/**
* 2.stream()流操作
*/
//2.1. 去重 distinct() 去重;collect(Collectors.toList())。封装成集合
List<Person> distinctList = list.stream().distinct().collect(Collectors.toList());
List<CreateOrderSkuDTO> collect = skuList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingInt(CreateOrderSkuDTO::getSkuId))), ArrayList::new));
//2.2 排序 sorted((第一个对象,第二个对象)->返回值) (升降序看是第几个对象与第几个对象比较)
List<Person> sortedList = list.stream().sorted((o1,o2)->o1.getAge()-o2.getAge()).collect(Collectors.toList());
//2.3 过滤 , filter(item->{}) item为每一项。 按照自己的需求来筛选list中的数据
List<Person> filterList = list.stream().filter(item->item.getAge()>3).collect(Collectors.toList());
//2.4 map(), 提取对象中的某一元素. 用每一项来获得属性(也可以直接用 对象::get属性())
List<String> mapList1 = list.stream().map(Person::getName).collect(Collectors.toList());
List<String> mapList2 = list.stream().map(item->item.getName()).collect(Collectors.toList());
//2.5 统计 sum() 。mapToDouble() 转换成double。还有其他类型转换。可以自己研究。
// max(),min(),average()
double sum = list.stream().mapToDouble(Person::getAge).sum();
//2.6 分组 Collectors.groupingBy(属性名)
Map<Integer, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getAge));
//2.7 多重分组 Collectors.groupingBy(属性,Collectors.groupingBy(属性))
Map<String, Map<Integer, List<Person>>> map2 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge())));
//2.8 分组并计算综合 Collectors.summarizingLong()
Map<String, Map<Integer, LongSummaryStatistics>> map3 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge(),Collectors.summarizingLong(Person::getSize))));
/**
* 3. 集合比较的简写方式
*/
list.sort((o1,o2)->{return o1.getAge()-o2.getAge();});
}
}
对集合按照单个属性分组
List<String> items =
Arrays.asList("apple", "apple", "banana",
"apple", "orange", "banana", "papaya");
// 分组
Map<String, List<String>> result1 = items.stream().collect(
Collectors.groupingBy(
Function.identity()
)
);
//{papaya=[papaya], orange=[orange], banana=[banana, banana], apple=[apple, apple, apple]}
System.out.println(result1);
// 分组计数
Map<String, Long> result2 = items.stream().collect(
Collectors.groupingBy(
Function.identity(), Collectors.counting()
)
);
// {papaya=1, orange=1, banana=2, apple=3}
System.out.println(result2);
Map<String, Long> finalMap = new LinkedHashMap<>();
//分组, 计数和排序
result2.entrySet().stream()
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));
// {apple=3, banana=2, papaya=1, orange=1}
System.out.println(finalMap);
User user1 = new User("zhangsan", "beijing", 10);
User user2 = new User("zhangsan", "beijing", 20);
User user3 = new User("lisi", "shanghai", 30);
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
Map<String, List<User>> collect = list.stream()
.collect(
Collectors.groupingBy(
User::getName/*, Collectors.counting()*/
)
);
//{lisi=[User{age=30, name='lisi', address='shanghai'}],
// zhangsan=[User{age=10, name='zhangsan', address='beijing'}, User{age=20, name='zhangsan', address='beijing'}]}
System.out.println(collect);
## 集合按照多个属性分组
### 1.多个属性拼接出一个组合属性
public static void main(String[] args) {
User user1 = new User("zhangsan", "beijing", 10);
User user2 = new User("zhangsan", "beijing", 20);
User user3 = new User("lisi", "shanghai", 30);
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
Map<String, List<User>> collect = list.stream().collect(Collectors.groupingBy(e -> fetchGroupKey(e)));
//{zhangsan#beijing=[User{age=10, name='zhangsan', address='beijing'}, User{age=20, name='zhangsan', address='beijing'}],
// lisi#shanghai=[User{age=30, name='lisi', address='shanghai'}]}
System.out.println(collect);
}
private static String fetchGroupKey(User user){
return user.getName() +"#"+ user.getAddress();
}
BigDecimal result = fileDatas.stream()
// 将user对象的age取出来map为Bigdecimal
.map(IpayRepayFileData::getTotalAmount)
// 使用reduce()聚合函数,实现累加器
.reduce(BigDecimal.ZERO,BigDecimal::add);
网友评论