lambda常见使用方法

这篇具有很好参考价值的文章主要介绍了lambda常见使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

之前在携程实习,遇到了lambda表达式,最近逛b站,刚好看到了。顺手整理一下。参考链接文章来源地址https://www.toymoban.com/news/detail-445843.html

介绍

  • lambda是一种提高生产力的一种书写代码的方式。
  • 代码中有很多的箭头,箭头左边是参数。例如,遍历的时候,每一个item,然后右边是要进行的操作。
  • 代码中用到了很多的“::”其实就是调用这个方法,然后形参跟我传递进来的一样,所以直接不写形参了。例如s -> s.length()可以直接修改为String::length。

遍历

  • 需求:打印list中的内容
import java.util.Arrays;
import java.util.List;

public class 遍历 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "orange");
        // 传统方式
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        // lambda-非简写
        list.forEach(l -> System.out.println(l));

        // lambda-简写
        // 如果要调用一个方法,并且方法中只有传递一个参数,而参数就是list的item,那么可以不用写传递的参数了
        list.forEach(System.out::println);
    }
}

排序

  • 需求:对list进行排序
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Num2排序 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("banana", "apple", "orange");
        // 传统方式
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        
        // lambda
        // 这里面o1,o2就是上面重写的compare的两个参数,而后面的就是return的内容,这里会自动进行return
        list.sort((o1, o2) -> o1.compareTo(o2));
    }
}

过滤

  • 需求:过滤list中首字母是a的元素
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class Num3过滤 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("banana", "apple", "orange");
        // 传统方式
        List<String> list2 = new LinkedList<>();
        for (String s : list) {
            if (s.startsWith("a")) {
                list2.add(s);
            }
        }

        // lambda
        // 这里需要借助list的stream。并且filter以后,并不是list,需要使用.collect(Collectors.toList())转成list
        List<String> list3 = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
    }
}

映射

  • 统计list中每个元素的长度
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class Num4映射 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("banana", "apple", "orange");
        // 传统方式
        List<Integer> list2 = new LinkedList<>();
        for (String s : list) {
            list2.add(s.length());
        }

        // lambda
        // 与过滤类似,但是这里需要用map。其实map表示我返回的不是之前的元素类型了。之前过滤的时候,返回的还是string,但是这里是要求Integer
        // 并且s -> s.length()可以直接修改为String::length
        List<Integer> list3 = list.stream().map(s -> s.length()).collect(Collectors.toList());
    }
}

归纳

  • 需求:对元素进行求和
import java.util.Arrays;
import java.util.List;

public class Num5归纳 {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        // 传统方式
        int sum = 0;
        for (Integer i : list) {
            sum += i;
        }
        System.out.println(sum);

        // lambda
        // 这里依旧需要借助stream,然后使用reduce函数,第一个参数为变量初始值,也就是传统方法中sum的初始值。然后a表示上一次的sum值,b表示当前遍历的值
        // 这里(a, b) -> a + b可以直接使用Integer::sum
        int sum2 = list.stream().reduce(0, (a, b) -> a + b);
        System.out.println(sum2);
    }
}

分组

  • 需求:根据元素的长度对元素进行分组
import java.util.*;
import java.util.stream.Collectors;

public class Num6分组 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("banana", "apple", "orange");
        // 传统方式
        Map<Integer, List<String>> groups = new HashMap<>();
        for (String s : list) {
            int length = s.length();
            if (!groups.containsKey(length)) {
                groups.put(length, new LinkedList<>());
            }
            groups.get(length).add(s);
        }

        // lambda
        // 这里用到了Collectors的groupingBy,注意Collectors是stream包中的
        Map<Integer, List<String>> groups2 = list.stream().collect(Collectors.groupingBy(String::length));
    }
}

实现接口

  • 需求:实现一个接口
public class Num7接口 {
    public static void main(String[] args) {
        // 传统方式
        MyInterface myInterface = new MyInterface() {
            @Override
            public void doSomething(String s) {
                System.out.println(s);
            }
        };
        myInterface.doSomething("hello world!");

        // lambda
        // 这里可以是(s) -> System.out.println(s)
        MyInterface myInterface2 = System.out::println;
        myInterface2.doSomething("hello world!");
    }
}

interface MyInterface {
    void doSomething(String s);
}

线程

  • 需求:创建线程,打印hello world!
    public class Num8线程 {
        public static void main(String[] args) {
            // 传统方式
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello world!");
                }
            });
            thread.start();
    
            // lambda
            // 其实就是实现接口
            Thread thread2 = new Thread(() -> System.out.println("hello World!"));
            thread2.start();
        }
    }

判空

  • 需求:将字符串的内容转为大写
import java.util.Optional;

public class Num9判空 {
    public static void main(String[] args) {
        // 传统方式
        String str = "hello world!";
        if (str != null) {
            System.out.println(str.toUpperCase());
        }

        // lambda
        // 这里用到了Optional,然后进行判空,随后使用map进行类型转换,然后如果存在内容的话,就打印
        Optional.ofNullable(str).map(String::toUpperCase).ifPresent(System.out::println);
    }
}

流水线

  • 需求:过滤出list中字母为a开头的,并且转成大写,然后继续排序
import java.util.*;
import java.util.stream.Collectors;

public class Num10流水线 {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("banana", "apple", "orange");
        // 传统方式
        List<String> list2 = new LinkedList<>();
        for (String s : list) {
            if (s.startsWith("a")) {
                list2.add(s.toUpperCase());
            }
        }
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });

        // lambda
        List<String> list3 =
                list.stream().filter(s -> s.startsWith("a")).map(String::toUpperCase).sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.toList());
    }
}

总结

  • 如果需要用filter是继续过滤的,如果还需要修改这个元素,则需要使用map进行修改。
  • 使用“::”的时候是在括号中的,并且之前的形式是由入参和入参传递到右侧方法的,而且顺序和个数一致。

到了这里,关于lambda常见使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 回溯算法中常见的使用方法逻辑整理

    回溯算法中常见的使用方法逻辑整理

    回溯算法 常见的使用方法逻辑整理 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,

    2024年04月15日
    浏览(11)
  • opencv常见类cv::rect使用方法

    下面是一篇关于C++中的cv::Rect相关的博文,包括对其的介绍、C++代码示例以及一些应用场景。希望对您有所帮助。 使用cv::Rect进行矩形区域操作 在计算机视觉领域中,经常需要对图像中的矩形区域进行操作和处理。OpenCV库提供了一个非常方便的类cv::Rect,用于表示和操作矩形

    2024年02月09日
    浏览(7)
  • selenium常见等待机制及其特点和使用方法

    selenium常见等待机制及其特点和使用方法

    目录 1、强制等待  2、隐式等待  3、显示等待  强制等待是在程序中直接调用Thread.sleep(timeout) ,来完成的, 该用法的优点是使用起来方便,语法也比较简单,缺点就是需要强制等待固定的时间,可能会造成测试的时间过长。 引入等待的原因是很多时候,程序运行的速度是大

    2024年02月14日
    浏览(10)
  • Hive使用中常见的问题及解决方法

            Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供SQL查询功能。在工作中大部分场景都会用到,下面列出几个 hive 使用中常见的问题及解决方法。 1)Hive 默认的输入格式处理是CombineHiveInputFormat,会对小文件进行合并 hive (default

    2024年02月10日
    浏览(11)
  • vue常见日期库的差异以及使用方法

    dayjs: https://day.js.org/zh-CN/ 注意: 24h制时 HH:mm:ss 其中 m,s小写 否则不准确 日期大写:YYYY-MM-DD dateformat : https://www.npmjs.com/package/dateformat 注意: 24h制时 HH:MM:ss 其中 M大写,s小写 否则不准确 日期大写:yyyy-mm-dd momentjs : http://momentjs.cn/docs/ 注意: 24h制时 HH:mm:ss 其中 m,s小写

    2024年02月14日
    浏览(7)
  • QT图像处理类QImage常见使用方法

    Qt 是一个跨平台的 C++ 库,提供了丰富的图像处理功能,可以用来实现各种图像处理任务,例如图像缩放、旋转、灰度化、二值化等。本文将介绍使用 Qt 实现图像处理的方法,并提供代码示例。 在 Qt 中,可以使用 QImage 类型来加载和保存图像,QImage 支持多种图像格式,例如

    2024年02月03日
    浏览(8)
  • java集合框架(三)ArrayList常见方法的使用

    @[toc] ## 一、什么是ArrarList ArrayList是Java中的一个动态数组类,可以根据实际需要自动调整数组的大小。ArrayList是基于数组实现的,它内部维护的是一个Object数组,默认初始化容量为10,当添加的元素个数超过了当前容量时,会自动扩容。 ArrayList也被广泛用于Java中的集合框架,

    2024年02月05日
    浏览(12)
  • java集合框架(二)LinkedList常见方法的使用

    @[toc] ## 一、什么是LinkedList LinkedList是Java中的一个双向链表。 它实现了List和Deque接口,在使用时可以像List一样使用元素索引,也可以像Deque一样使用队列操作。 LinkedList每个节点都包含了前一个和后一个节点的引用,因此可以很方便地在其中进行节点的插入、删除和移动。 相

    2024年02月05日
    浏览(10)
  • nmap在kali的使用方法和常见命令(入门)

    nmap在kali的使用方法和常见命令(入门)

    kali linux 自带有namp,无需下载安装,命令形式为namp + 点击可查看使用说明信息 扫描目标计算机,一般可以获取以下信息: 是否在线 所在网络的拓扑 开放的端口 所使用的操作系统 所运行的服务与版本 所存在的漏洞 常用命令穷举 经典单个主机IP/域名普通扫描: 只检测是否

    2024年02月11日
    浏览(24)
  • CodeGeeX使用中的常见问题与解决方法

    CodeGeeX使用中的常见问题与解决方法

    上一篇文章中我们介绍了CodeGeeX插件中的“隐藏”设置,方便用户能够选择符合自己编程习惯的方式,更流畅的使用CodeGeeX。但仍然有一些使用问题,需要我们在产品持续迭代中进行优化,也有些问题是受限于IDE平台默认的交互或解析方式。今天为大家整理的,就是CodeGeeX使用

    2024年02月11日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包