目录
Java之Lambda使用
流操作
1.Java中filter和removeIf.
- 介绍
- 区别:
- filter过滤, 会把符合的留下来.
- removeIf过滤之后, 会把相同的干掉.
- 区别:
- 示例
List<Student> stuList = new ArrayList<>();
Collections.addAll(stuList,
new Student(1, "张三"),
new Student(2, "李四"),
new Student(3, "王老五")
);
// 使用filter过滤之后(会把符合的留下来,比如:Student{stuId=1, stuName='张三'})
List<Student> filterList = stuList.stream().filter(student -> {
Integer valueOf = Integer.valueOf("1");
return !valueOf.equals(student.getStuId());
}).collect(Collectors.toList());
// 使用removeIf过滤之后(会把相同的干掉,比如干掉了“王老五”)
boolean removeIf = filterList.removeIf(student -> {
Integer valueOf = Integer.valueOf("3");
return valueOf.equals(student.getStuId());
});
// 最后剩下:Student{stuId=2, stuName='李四'}
filterList.forEach(System.out::println);
2.Java中forEach使用.
- 介绍
- 集合的遍历forEach方法
- 示例
// 1. 输出一列
list.stream().forEach(v -> System.err.println(v.getName()+","+v.getSex()));
// 2. 遍历Map集合
map.forEach((key, value) -> System.out.println("key:" + key + "; value" + JSON.toJSON(value)));
3.Java中Peek使用.
- 介绍
- peek 方法很简单,我们在 peek 方法里面做任意没有返回值的事情,比如打印日志.
- 示例
// 1. 打印日志
public void testPeek() {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream().map(s -> Integer.valueOf(s))
.peek(s -> System.out.println(s))
.collect(Collectors.toList());
}
// 2. 给List集合中某一个字段、数组赋值
wordVoList.stream().peek(aItem - > {
List<String> strList = xxxMapper.findAll();
aItem.setstuList(strList);
}
).collect(collectors.toList());
// 3. 使用peek调用方法给集合中字段赋值
.stream().peek(xxxServiceImpl::accept).collect(collectors.toList());
private static void accept(ExperienceVO aItem) {
if (不等于空) {
aItem.setCaseStatusFlag(ExperienceEnum.getValue(aItem.CaseStatus()));
}
}
4.Java中Map使用.
- 介绍
- map 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以使返回的流中的元素是 B.
- 实例
// 1. 通过 map 方法list中元素转化成 小写
public void testMap() {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
List<String> strLowerList = list.stream()
.map(str -> str.toLowerCase())
.collect(Collectors.toList());
}
// 2. 将集合中某个字段转换为单独一个集合的两种方式.
List<Integer> listPlus = list.stream().map(value -> value.getId()).collect(Collectors.toList());
List<Integer> listPlus = list.stream().map(Student::getId).collect(Collectors.toList());
// 3. 将DTO转换为VO
private static List<LocationVo> convert2LocationVo(List<LocationDto> locationDtoList) {
if (null == locationDtoList) {
return null;
}
return locationDtoList.stream().map(item -> {
LocationVo locationVo = new LocationVo();
locationVo.setUpdateBy(item.getUpdateBy());
locationVo.setUpdateDate(item.getUpdateDate());
locationVo.setVersion(item.getVersion());
return locationVo;
}).collect(Collectors.toList());
}
// 4. Lambda .map this调用方法
//聚合方法
private List<StudentPlus> obj(List<Student> stuList) {
return stuList.stream().map(this::conversion).collect(Collectors.toList());
}
//转换方法
private StudentPlus conversion(Student stu) {
StudentPlus studentPlus = new StudentPlus();
studentPlus.setId(stu.getId());
studentPlus.setName(stu.getName());
studentPlus.setDate(new Date(stu.getDate()));
return studentPlus;
}
5.Java中MapTo...使用.
- 介绍
- mapToInt 方法的功能和 map 方法一样,只不过 mapToInt 返回的结果已经没有泛型,已经明确是 int 类型的流了,源码如下:
- 实例
public void testMapToInt () {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
List<Integer> collect = list.stream()
.mapToInt(s -> Integer.valueOf(s))
// 一定要有 mapToObj,因为 mapToInt 返回的是 IntStream,因为已经确定是 int 类型了
// 所有没有泛型的,而 Collectors.toList() 强制要求有泛型的流,所以需要使用 mapToObj
// 方法返回有泛型的流
.mapToObj(s -> s)
.collect(Collectors.toList());
double sum = list.stream()
.mapToDouble(s -> Double.valueOf(s))
// DoubleStream/IntStream 有许多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等方法
.sum();
}
6.Java中Distinct使用.
- 介绍
- distinct 方法有去重的功能
- 可在.map()、.stream()关键字之后使用.
- 实例
public void testDistinct(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
list.stream()
.map(s -> Integer.valueOf(s))
.distinct()
.collect(Collectors.toList());
}
7.Java中Sorted使用.
- 介绍
- Sorted 方法提供了排序的功能,并且允许我们自定义排序
- 实例
public void testSorted() {
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream()
.map(s -> Integer.valueOf(s))
// 等同于 .sorted(Comparator.naturalOrder()) 自然排序
.sorted()
.collect(Collectors.toList());
// 自定义排序器
list.stream()
.map(s -> Integer.valueOf(s))
// 反自然排序
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
}
// 2. 降序、升序
.peek(aItem -> aItem.setDateSoftRead(dateFormat.format(aItem.getDateSoft())))
.sorted(Comparator.comparing(ResourceFeverRankingVO::getDateSoft).reversed())
.collect(Collectors.toList());
8.Java中skip使用.
- 介绍
- 跳过流中前面几个元素, 下标从0开始
- 实例
List<String> list = new ArrayList<>();
Collections.addAll(list, "张三", "李四", "王老五", "潘丽平");
System.out.println(list.stream().skip(2).collect(Collectors.toList()));
// TODO 输出: [王老五, 潘丽平]
非流操作
9.Java中groupingBy使用.
- 介绍
- groupingBy 是能够根据字段进行分组
- toMap 是把 List 的数据格式转化成 Map 的格式
- groupingBy 是能够根据字段进行分组
- 实例
// 1. 自定义分组
public void testGroupBy(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
Map<String, List<String>> strList = list.stream().collect(Collectors.groupingBy(s -> {
if("2".equals(s)) {
return "2";
}else {
return "1";
}
}));
}
// 2. 按类目进行分组
Map<String, List<Product>> prodMap= prodList.stream().collect(Collectors.groupingBy(Product::getCategory));
// 3. 先按照类别分组,再聚合求总数
prodList.stream()
.collect(Collectors.groupingBy(Product::getCategory, Collectors.counting()));
// 4. 先按照类别分组,再聚合运算(把num相加)
prodList.stream()
.collect(Collectors.groupingBy(Product::getCategory, Collectors.summingInt(Product::getNum)));
10.Java中Collect使用.
- 介绍
- 将操作后的对象转化为新的对象
- 实例
// 1.转换为List集合
list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());
// 2.可配合分组使用
// 3.转换为Map的2种方法
.collect(Collectors.toMap(String::valueOf, Function.identity()));
.collect(Collectors.toMap(PersonDto::getId, o -> o));
// 4.List转Map,id作为key,name作为value,id不可重复
Map<Long, String> collect = objects.stream().collect(Collectors.toMap(PersonDto::getId, PersonDto::getUserName));
// 5.List转Map,id作为key,name作为value,如果Id重复取第一个name
Map<Long, String> collect = objects.stream().collect(Collectors.toMap(PersonDto::getId, PersonDto::getUserName, (o1, o2) -> o1));
// 相反 如果Id重复取最后一个name
Map<Long, String> collect2 = objects.stream().collect(Collectors.toMap(PersonDto::getId, PersonDto::getUserName, (o1, o2) -> o2));
11.Java中FindFirst、findAny 查找使用.
- 介绍
- findAny查找前流中的任意元素
- findFirst查找第一个元素
- 实例
Menu pork = new Menu("猪肉", 9.9, 10.0, "肉类");
Menu beef = new Menu("牛肉", 38.8, 5.0, "肉类");
Menu chicken = new Menu("鸡肉", 6.5, 30.0, "肉类");
Menu tomato = new Menu("土豆", 3.5, 30.0, "蔬菜");
Menu potato = new Menu("西红柿", 7.5, 20.0, "蔬菜");
Menu apple = new Menu("苹果", 3.5, 20.0, "水果");
Menu orange = new Menu("橙子", 4.0, 20.0, "水果");
List<Menu> menuList = Arrays.asList(pork, beef, chicken, tomato, potato, apple, orange);
// 苹果
menuList.stream().filter(menu -> menu.getType().equals("水果")).findFirst().ifPresent(menu -> System.out.println(menu.getName()));
// 苹果
Optional<Menu> fruitMenu = menuList.stream().filter(menu -> menu.getType().equals("水果")).findAny();
11.Java中Limit使用.
- 介绍
- limit 方法会限制输出值个数,入参是限制的个数大小
- 实例
public void testLimit(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("3");
}};
list.stream()
.map(s -> Integer.valueOf(s))
.limit(2L)
.collect(Collectors.toList());
}
11.Java中Max,Min使用.
- 介绍
- 通过max、min方法,可以获取集合中最大、最小的对象
- 实例
public void testMaxMin(){
List<String> list = new ArrayList<String>() {{
add("1");
add("2");
add("2");
}};
list.stream().max(Comparator.comparing(s -> Integer.valueOf(s))).get();
list.stream().min(Comparator.comparing(s -> Integer.valueOf(s))).get();
}
标签:Java,Collectors,stream,List,list,collect,使用,Lambda
From: https://www.cnblogs.com/Twittery/p/17334180.html