最近在公司CV习惯了,突然发现自己对函数式编程有点生疏,自己就写点例子,供大家参考学习。建议先别看答案哦,自己想一想。
-
先给一个PersonThis对象
-
package com.leizhe.learn.lambda1; /** * @author: leizhe * @date: 2021/2/2 16:20 * @description: */ public class PersonThis { private String name; // 姓名 private int salary; // 薪资 private int age; // 年龄 private String sex; //性别 private String area; // 地区 private String salaryString; // 字符串类型的薪资 public PersonThis() { } // 构造方法 public PersonThis(String name, int salary, int age,String sex,String area) { this.name = name; this.salary = salary; this.age = age; this.sex = sex; this.area = area; } public PersonThis(String name, int salary, int age, String sex, String area, String salaryString) { this.name = name; this.salary = salary; this.age = age; this.sex = sex; this.area = area; this.salaryString = salaryString; } // get set 方法省略啦 }
-
看完上面的对象之后,下面开始提一些问题啦
-
筛选员工中工资高于8000的人,并形成新的集合
-
获取员工工资最高的人
-
按照工资从高到底进行排序
-
按照工资 选取前三的人员
-
求平均年龄
-
求工资最高
-
求工资之和
-
同时 求和 最高 最小 平均 个数 (工资)
-
按照 工资是否大于8000进行分组
-
根据性别进行分组
-
先根据 性别 再根据地区分组
-
按照工资 取前三个的汇总
-
按照 工资 (字符串字段) 取前三个的工资汇总
-
按照工资, 求前三 和 从第四名开始之间的工资之差
-
字符串按照长度排序
-
字符串按照获取最长的字符串
-
将所有人的名字进行拼接成一个字符串
-
求 每个城市薪资最高的人 ***难度较高***需要看一下JDK1.8 说明文档
-
排序,先按照工资 desc,再按照年龄asc
-
除去工资前3 后面的所有工资之和
-
计算 第3 - 5 工资高之和
-
下面就是小6写出的答案,欢迎大家在后台提出好问题,以后会追加出来
-
对于JDK1.8的说明文档,大家可以百度,也可以在后台回复找我要(我也是百度找的O(∩_∩)O哈哈~)
package com.leizhe.learn.lambda1;
import com.google.common.base.Function;
import org.apache.logging.log4j.util.PropertySource;
import sun.awt.windows.WWindowPeer;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.stream.Collector;
import java.util.stream.Collectors;
/**
* @author: leizhe
* @date: 2021/1/28 17:17
* @description:
*/
public class Learn001 {
public static void main(String[] args) {
List<PersonThis> list = new ArrayList<PersonThis>();
list.add(new PersonThis("小张", 7000, 25, "男", "杭州"));
list.add(new PersonThis("小赵", 7800, 21, "女", "杭州"));
list.add(new PersonThis("小钱", 8200, 24, "女", "上海"));
list.add(new PersonThis("小孙", 9500, 25, "男", "上海"));
list.add(new PersonThis("小李", 8900, 23, "男", "上海"));
list.add(new PersonThis("小周", 7900, 26, "女", "上海"));
list.add(new PersonThis("小吴", 7900, 27, "女", "上海"));
//region 筛选员工中工资高于8000的人,并形成新的集合
List<String> nameList = list.stream().filter(t -> t.getSalary() > 8000).map(PersonThis::getName).collect(Collectors.toList());
//endregion
//region 获取员工工资最高的人
PersonThis personThis = list.stream().max(Comparator.comparing(PersonThis::getSalary)).get();
//endregion
//region 按照工资从高到底进行排序
list.sort(Comparator.comparing(PersonThis::getSalary).reversed());
//endregion
//region 按照工资 选取前三的人员
List<PersonThis> collect5 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).collect(Collectors.toList());
//endregion
//region 求平均年龄
Double collect = list.stream().collect(Collectors.averagingInt(PersonThis::getAge));
//endregion
//region 求工资最高
int salaryMax = list.stream().max(Comparator.comparing(PersonThis::getSalary)).get().getSalary();
Integer integer = list.stream().map(PersonThis::getSalary).collect(Collectors.maxBy(Integer::compare)).get();
//endregion
//region 求工资之和
Double collect1 = list.stream().collect(Collectors.summingDouble(PersonThis::getSalary));
double sum = list.stream().mapToDouble(PersonThis::getSalary).sum();
//endregion
//region 同时 求和 最高 最小 平均 个数 (工资)
DoubleSummaryStatistics result = list.stream().collect(Collectors.summarizingDouble(PersonThis::getSalary));
double sum1 = result.getSum();
double max = result.getMax();
double min = result.getMin();
double average = result.getAverage();
long count1 = result.getCount();
//endregion
//region 按照 工资是否大于8000进行分组
Map<Boolean, List<PersonThis>> collect2 = list.stream().collect(Collectors.partitioningBy(t -> t.getSalary() > 8000));
//endregion
//region 根据性别进行分组
Map<String, List<PersonThis>> collect3 = list.stream().collect(Collectors.groupingBy(PersonThis::getSex));
//endregion
//region 先根据 性别 再根据地区分组
Map<String, Map<String, List<PersonThis>>> collect4 = list.stream().collect(Collectors.groupingBy(PersonThis::getSex, Collectors.groupingBy(PersonThis::getArea)));
//endregion
//region 按照工资 取前三个的汇总
Double collect6 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).collect(Collectors.summingDouble(PersonThis::getSalary));
double sum2 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).mapToDouble(PersonThis::getSalary).sum();
double sum3 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).mapToDouble(t -> t.getSalary()).sum();
//endregion
//region 按照 工资 (字符串字段) 取前三个的工资汇总 没算出来
// Double collect7 = list.stream().sorted(Comparator.comparing(t -> Double.parseDouble(t.getSalaryString())).reversed()).limit(3).collect(Collectors.summingDouble(t -> Double.parseDouble(t.getSalaryString())));
//endregion
//region 按照工资, 求前三 和 从第四名开始之间的工资之差
double sum6 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).limit(3).mapToDouble(PersonThis::getSalary).sum();
double sum7 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).skip(3).mapToDouble(PersonThis::getSalary).sum();
double v = sum7 - sum6;
//endregion
//region 字符串按照长度排序
List<String> listStr = Arrays.asList("adnm", "admmt", "pot", "xbangd", "weoujgsd");
listStr.sort(Comparator.comparing(String::length).reversed());
//endregion
//region 字符串按照获取最长的字符串
String maxStr = listStr.stream().max(Comparator.comparing(String::length)).get();
//endregion
//region 将所有人的名字进行拼接成一个字符串
String collect7 = list.stream().map(PersonThis::getName).collect(Collectors.joining(","));
//endregion
//region 求 每个城市薪资最高的人 ***难度较高***需要看一下JDK1.8 说明文档
// Map<String, Optional<PersonThis>> collect8 = list.stream().collect(Collectors.groupingBy(PersonThis::getArea, Collectors.maxBy(Comparator.comparing(PersonThis::getSalaryString))));
Map<String, List<PersonThis>> collect10 = list.stream().collect(Collectors.groupingBy(PersonThis::getArea));
Comparator<PersonThis> salaryComparing = Comparator.comparing(PersonThis::getSalary);
Map<String, Optional<PersonThis>> collect11 = list.stream().collect(Collectors.groupingBy(PersonThis::getArea, Collectors.reducing(BinaryOperator.maxBy(salaryComparing))));
//endregion
//region 排序,先按照工资 desc,再按照年龄asc
List<PersonThis> collect9 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed().thenComparing(PersonThis::getAge)).collect(Collectors.toList());
List<PersonThis> collect8 = list.stream().sorted((t1, t2) -> {
if (t1.getSalary() == t2.getSalary()) {
return t1.getAge() - t2.getAge();
} else {
return t1.getSalary() - t2.getSalary();
}
}).collect(Collectors.toList());
//endregion
//region 除去工资前3 后面的所有工资之和
double sum4 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary).reversed()).skip(3).mapToDouble(PersonThis::getSalary).sum();
//endregion
//region 计算 第3 - 5 工资高的之和
double sum5 = list.stream().sorted(Comparator.comparing(PersonThis::getSalary)).skip(2).limit(3).mapToDouble(PersonThis::getSalary).sum();
//endregion
//region int排序
List<Integer> listInt = Arrays.asList(3, 6, 1, 9, 4, 7);
listInt.sort(Comparator.comparing(Integer::intValue));
listInt.sort(Comparator.comparing(Integer::intValue).reversed());
//endregion
//region 计算Integer集合中大于6的元素的个数
long count = listInt.stream().filter(t -> t > 6).count();
//endregion
//region 验证 PersonThis::getSalary
Function<PersonThis, Integer> getSalary = PersonThis::getSalary;
//endregion
System.out.println("//the end");
}
}
欢迎大家关注菜鸟小6