首页 > 编程语言 >Java之Lambda使用

Java之Lambda使用

时间:2023-04-19 18:02:12浏览次数:39  
标签:Java Collectors stream List list collect 使用 Lambda

目录

Java之Lambda使用

流操作

1.Java中filter和removeIf.

  1. 介绍
    • 区别:
      • filter过滤, 会把符合的留下来.
      • removeIf过滤之后, 会把相同的干掉.
  2. 示例
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使用.

  1. 介绍
    • 集合的遍历forEach方法
  2. 示例
    // 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使用.

  1. 介绍
    • peek 方法很简单,我们在 peek 方法里面做任意没有返回值的事情,比如打印日志.
  2. 示例
// 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使用.

  1. 介绍
    • map 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以使返回的流中的元素是 B.
  2. 实例
// 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...使用.

  1. 介绍
    • mapToInt 方法的功能和 map 方法一样,只不过 mapToInt 返回的结果已经没有泛型,已经明确是 int 类型的流了,源码如下:
  2. 实例
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使用.

  1. 介绍
    • distinct 方法有去重的功能
    • 可在.map()、.stream()关键字之后使用.
  2. 实例
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使用.

  1. 介绍
    • Sorted 方法提供了排序的功能,并且允许我们自定义排序
  2. 实例
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使用.

  1. 介绍
    • 跳过流中前面几个元素, 下标从0开始
  2. 实例
List<String> list = new ArrayList<>();
Collections.addAll(list, "张三", "李四", "王老五", "潘丽平");
System.out.println(list.stream().skip(2).collect(Collectors.toList()));
// TODO 输出: [王老五, 潘丽平]

非流操作

9.Java中groupingBy使用.

  1. 介绍
    • groupingBy 是能够根据字段进行分组
      • toMap 是把 List 的数据格式转化成 Map 的格式
  2. 实例
// 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. 介绍
    • 将操作后的对象转化为新的对象
  2. 实例
// 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 查找使用.

  1. 介绍
    • findAny查找前流中的任意元素
    • findFirst查找第一个元素
  2. 实例
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使用.

  1. 介绍
    • limit 方法会限制输出值个数,入参是限制的个数大小
  2. 实例
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使用.

  1. 介绍
    • 通过max、min方法,可以获取集合中最大、最小的对象
  2. 实例
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

相关文章

  • javasec(四)序列化与反序列化基本原理
    title:javasec(四)序列化与反序列化基本原理tags:-javasec-反序列化categories:-javaseccover:'https://blog-1313934826.cos.ap-chengdu.myqcloud.com/blog-images/1.jpeg'feature:falsedate:2023-04-1816:02:20这篇文章介绍java序列化与反序列化基本原......
  • javasec(一)java反射
    这篇文章介绍javasec基础知识--java反射。0x01反射是什么?反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。在程序运行状态中,对于任意一个类或对象,都能够获取到这个类的所有属性和方法(包括私有属性和方法),这种动态获取信息以及动态调用对象方法的......
  • javasec(五)URLDNS反序列化分析
    这篇文章介绍URLDNS就是ysoserial中⼀个利⽤链的名字,但准确来说,这个其实不能称作“利⽤链”。因为其参数不是⼀个可以“利⽤”的命令,⽽仅为⼀个URL,其能触发的结果也不是命令执⾏,⽽是⼀次DNS请求。ysoserial打包成jar命令mvncleanpackage-DskipTests,刚刚入门所以用这条链作......
  • javasec(六)RMI
    这篇文章介绍java-RMI远程方法调用机制。RMI全称是RemoteMethodInvocation,远程⽅法调⽤。是让某个Java虚拟机上的对象调⽤另⼀个Java虚拟机中对象上的⽅法,只不过RMI是Java独有的⼀种RPC方法。看这篇之前可以先去看看RPC:https://www.bilibili.com/video/BV1zE41147Zq?from=searc......
  • 一个使用公式化序列分类的EAL学术写作辅助环境
    一个使用公式化序列分类的EAL学术写作辅助环境(AnassistiveenvironmentforEALacademicwritingusingformulaicsequencesclassification)★★实验结果实验组、对照组和两维度分析:对照组学生:使用短语库;实验组学生:使用提出的应用程序(ARP)作为辅助工具。  一、摘要......
  • C#中使用DataGridView显示二维数组中的内容
    https://blog.csdn.net/jasonleesjtu/article/details/7555514int[,]TABLE=newint[,]{{1,2,3},{4,5,6}};DataTabledt=newDataTable();for(inti=0;i<TABLE.GetLength(1);i++)dt.Columns.Add(i.ToS......
  • pm2在服务器中的使用
    服务器上安装node.js并配置相关环境安装PM2如果没有权限,则用sudo安装;安装指令:sudunpminstallpm2-g(需要全局安装查看程序进程:pm2ls原本nodeserver.js指令替换为pm2startserver.js(记得关闭node进程进程由pm2启动后,可以执行以下指令:查看进程:pm2ls监控查......
  • 使用SAX读取XML文件--(SAX的基础语法练习)
    SAX的基本知识:XML的SAX解析: DOM解析原理:一次性把XML文档加载进内存,然后在内存中构建Document树,对内存要求比较高。       DOM解析缺点:不适合读取大容量的XML文件,容易导致内存溢出。 SAX解析原理:加载一点,读取一点,处理一点,对内存要求比较低。  SAX解析工具:Sun公司提......
  • 类中自定义函数并调用and使用钩子函数打印类中变量
    在一个类中自定义一个函数A,并在前向传播函数forword中调用这个函数假设您正在编写一个PyTorch模型,您可以按照以下方式在类中定义函数A,并在forward函数中调用它:importtorchimporttorch.nnasnnclassMyModel(nn.Module):def__init__(self):super(MyMod......
  • 亚马逊平台使用API接口通过关键字搜索商品
    亚马逊公司(Amazon,简称亚马逊;NASDAQ:AMZN),2022年营收为5140亿美元,是美国最大的一家网络电子商务公司,位于华盛顿州的西雅图。是网络上最早开始经营电子商务的公司之一,亚马逊成立于1994年,一开始只经营网络的书籍销售业务,现在则扩及了范围相当广的其他产品,已成为全球商品品种最多的网......