广告
返回顶部
首页 > 资讯 > 精选 >lambda表达式如何在JAVA8中使用
  • 460
分享到

lambda表达式如何在JAVA8中使用

2023-06-15 03:06:12 460人浏览 薄情痞子
摘要

这期内容当中小编将会给大家带来有关lambda表达式如何在JAVA8中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一:什么是 Stream?Stream(流)是一个来自数据源的元素队列并支持聚合操作

这期内容当中小编将会给大家带来有关lambda表达式如何在JAVA8中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一:什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。 可以是集合数组,I/O channel, 产生器generator 等。

聚合操作 类似sql语句一样的操作, 比如filter, map, reduce, find, match, sorted等。 和以前的Collection操作不同,Stream操作还有两个基础的特征如下:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格。 这样做可以对操作进行优化, 比如延迟执行和短路。

  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫>做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

二:Stream api 使用

1:使用Stream步骤:

(1)先产生一个流(Stream)一个数据源,获取一个流。

(2)中间链式操作 一个中间的操作链,对数据源的数据进行处理。

(3)产生一个新流:一个终止操作,执行中间操作,产生结果。

注意:Stream操作是延迟执行,他们会等需要结果的时候才会执行。

总结

  • 中间操作常用方法有:筛选:filter 映射:map 排序:sorted提取与组合 收集:collect。

  • 终止操作:遍历:foreach 匹配:find、match 规约:reduce 聚合:max、min、count。

lambda表达式如何在JAVA8中使用

2:创建Stream的方法的4种方式

【1】Collection接口中的方法:        default Stream<E> stream()  获取串行流        default Stream<E> parallelStream() 获取并行流      案例:
//方式1:Collection接口的方法Collection collection = new ArrayList();Stream stream = collection.stream();Stream stream1 = collection.parallelStream();//方式2:通过Arrays中的Stream方法  数组IntStream stream2 = Arrays.stream(new int[]{1, 2, 3, 4, 5});//方式3:Stream中的of方法Stream<String> stream3 = Stream.of("111", "222", "333");//方法4:Stream中的方法  创建无限流  (结果是无线个)Stream<Integer> iterate = Stream.iterate(2, (x) -> x + 2);

3:中间操作

1:筛选与切片

① Stream filter(Predicate<?super T> predicate)返回由与此给定谓词匹配的此流的元素组成的流。 --->接收Lambda,从流中排除某些元素。

 //1:创建Stream;  Stream<Student> stream = list.stream(); //2:filter方法(找到年龄大于等于18岁的学生) Stream<Student> studentStream = stream.filter((student) -> student.getAge() >= 18);  //3:终止操作;如果没有终止操作的话,上面的第二步中间操作不执行   studentStream.forEach(System.out::println);   

②Stream limit(Long maxSize) 返回由该流的元素组成的流,截断长度不能超过maxSize. 只有找到maxSize个满足条件的即可。 ---->截断流,使其元素不超过给定的数量。

 public void limitTest02() {        //Limit方法 短路(效率增高),只要找到了2个满足条件的,后面的迭代操作就不在执行了!        list.stream().filter(x -> {            System.out.println("正在过滤!!");            return x.getAge() > 18;        }).limit(2).forEach(System.out::println);    }

③Stream skip(Long n) 在丢掉流的第一个n元素后,返回由该流的n元素组成的流,如果此流包含少于n元素,那么将返回一个空流。 ---->跳过元素,返回一个扔掉了前n个元素的流。 如果流中的元素不足n个,则返回一个空流,与limit(n)互补。

public void skipTest03() {     //skip 方法跳过前2个满足条件的  留下后面满足条件的结果!!     list.stream().filter(x -> {         System.out.println("正在过滤后面满足条件的结果");         return x.getAge() > 18;     }).skip(2).forEach(System.out::println); }

④Stream distinct()

注意: 自定义的类在去重的过程中必须重新hashCode和equals方法,因为distinct实现的时候底层去找这两个方法。

 public void distinctTest04() {   //distinct 去重操作!       list.stream().distinct().forEach(System.out::println);   }

⑤ map映射:

如果需要将流中的元素映射到另一个流中,可以使用map方法。方法签名: Stream map(Function<? super T, ? extends R> mapper); 该接口需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流。 Stream流中的map方法基本使用的代码如:

@Testpublic void testMap() {    Stream<String> original = Stream.of("11", "22", "33");    Stream<Integer> result = original.map(Integer::parseInt);    result.forEach(s -> System.out.println(s + 10));}//这段代码中,map方法的参数通过方法引用,将字符串类型转换成为了int类型(并自动装箱为Integer类对象)。

⑥ 排序 (两种方式)

(1)Stream sorted()返回此流元素组成的流,根据自然顺序排序。底层按照内部比较器进行排序,实现Comparable接口中的compareTo方法。

(2)Stream sorted(Comparator<?super T>comparator) 返回由此元素组成的流,根据挺的Comparator进行顺序排序。指定顺序。 指定排序策略:底层按照外部比较器进行排序 Comparator接口一定要重新Compare方法。

基本使用Stream流中的sorted方法基本使用的代码如:@Testpublic void testSorted() {    // sorted(): 根据元素的自然顺序排序    // sorted(Comparator<? super T> comparator): 根据比较器指定的规则排序    Stream.of(33, 22, 11, 55)            .sorted()            .sorted((o1, o2) -> o2 - o1)            .forEach(System.out::println);}这段代码中,sorted方法根据元素的自然顺序排序,也可以指定比较器排序。

4:终止操作

①查找(find)和匹配(match)

如果需要找到某些数据,可以使用find相关方法。方法签名:

  • Optional findFirst();

  • Optional findAny();

Stream流中的find相关方法使用代码:

@Testpublic void testFind() {    Optional<Integer> first = Stream.of(5, 3, 6, 1).findFirst();    System.out.println("first = " + first.get());    Optional<Integer> any = Stream.of(5, 3, 6, 1).findAny();    System.out.println("any = " + any.get());}

Stream流的match方法

如果需要判断数据是否匹配指定的条件,可以使用Match相关方法。方法签名:

  • boolean allMatch(Predicate<? super T> predicate);

  • boolean anyMatch(Predicate<? super T> predicate);

  • boolean noneMatch(Predicate<? super T> predicate);

基本使用 Stream流中的Match相关方法使用代码如:

@Testpublic void testMatch() {    boolean b = Stream.of(5, 3, 6, 1)            // .allMatch(e -> e > 0); // allMatch: 元素是否全部满足条件            // .anyMatch(e -> e > 5); // anyMatch: 元素是否任意有一个满足条件            .noneMatch(e -> e < 0); // noneMatch: 元素是否全部不满足条件    System.out.println("b = " + b);}

②:遍历 foreach

//forEach 用来遍历流中的数据 @Test    public void test02() {        //案例1、2下面两种写法等同        list.stream().map((x)->x.getName()).forEach(System.out::println);        list.stream().map(Student::getName).forEach(System.out::println);    }

③Stream流的max、min

List<String> list13 = Arrays.asList("zhangsan","lisi","wangwu","xuwujing"); int maxLines = list13.stream().mapToInt(String::length).max().getAsInt(); int minLines = list13.stream().mapToInt(String::length).min().getAsInt(); System.out.println("最长字符的长度:" + maxLines+",最短字符的长度:"+minLines); //最长字符的长度:8,最短字符的长度:4

④Stream流的count

 // Stream流提供count方法来统计其中的元素个数:long count();  //该方法返回一个long值代表元素个数。基本使用:@Testpublic void testCount() {   List<String> strList = new ArrayList<>();   Collections.addAll(strList, "张无忌", "周芷若", "赵敏", "小昭", "杨不悔);   System.out.println(strList.stream().count());}

⑤ 分组:groupingBy;

当我们使用Stream流处理数据后,可以根据某个属性将数据分组:

// 案例:    @Test    public void testGroup() {        Stream<Student> studentStream = Stream.of(                new Student("赵丽颖", 52, 95),                new Student("杨颖", 56, 88),                new Student("迪丽热巴", 56, 55),                new Student("柳岩", 52, 33));        // Map<Integer, List<Student>> map = studentStream.collect(Collectors.groupingBy(Student::getAge));        // 将分数大于60的分为一组,小于60分成另一组        Map<String, List<Student>> map = studentStream.collect(Collectors.groupingBy((s) -> {            if (s.getSocre() > 60) {                return "及格";            } else {                return "不及格";            }        }));        map.forEach((k, v) -> {            System.out.println(k + "::" + v);        });    }
效果:不及格::[Student{name='迪丽热巴', age=56, socre=55}, Student{name='柳岩', age=52, socre=33}]及格::[Student{name='赵丽颖', age=52, socre=95}, Student{name='杨颖', age=56, socre=88}]

⑥拼接:joining

Collectors.joining会根据指定的连接符,将所有元素连接成一个字符串。// 拼接@Testpublic void testJoining() {    Stream<Student> studentStream = Stream.of(            new Student("赵丽颖", 52, 95),            new Student("杨颖", 56, 88),            new Student("迪丽热巴", 56, 99),            new Student("柳岩", 52, 77));    String collect = studentStream            .map(Student::getName)            .collect(Collectors.joining(">_<", "^_^", "^v^"));    System.out.println(collect);}

效果:

^_^赵丽颖>_<杨颖>_<迪丽热巴>_<柳岩^v^

⑦聚合:toList,toSet,toMap;

Stream流提供collect方法,其参数需要一个java.util.stream.Collector<T,A, R>接口对象来指定收集到哪种集合中。

  • public static Collector<T, ?, List> toList():转换为List集合。

  • public static Collector<T, ?, Set> toSet():转换为Set集合。

  • public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper):转换为Map集合。

下面是这两个方法的基本使用代码:

// 将流中数据收集到集合中@Testpublic void testStreamToCollection() {    Stream<String> stream = Stream.of("aa", "bb", "cc");    // List<String> strList = stream.collect(Collectors.toList());    // Set<String>  strSet = stream.collect(Collectors.toSet());    ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));    HashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));}

toMap

@Test    public void testCollectToMap(){        //案例1        List<Integer> list = Arrays.asList(1, 2, 3);        Map<String, String> collect1 = list.stream().map(i -> i).collect(Collectors.toMap(key -> "key" + key, value -> "value:" + value));         //实体list转化map id作为主键,对象作为value        List<User> userList =new ArrayList<User>();        UserTask userTask = new UserTask();        userTask.setId(1);        userTask.setName("测试");        userList.add(userTask);         Map<Integer,UserTask> taskMap = userList.stream().collect(Collectors.toMap(UserTask::getId, entity -> entity));        System.out.println(collect1.toString());        System.out.println(taskMap.toString());    }

上述就是小编为大家分享的lambda表达式如何在JAVA8中使用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: lambda表达式如何在JAVA8中使用

本文链接: https://www.lsjlt.com/news/277096.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在Java8中使用lambda表达式
    这篇文章给大家介绍如何在Java8中使用lambda表达式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 0. 函数式编程    函数式编程(Functional Pr...
    99+
    2023-06-14
  • lambda表达式如何在JAVA8中使用
    这期内容当中小编将会给大家带来有关lambda表达式如何在JAVA8中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一:什么是 Stream?Stream(流)是一个来自数据源的元素队列并支持聚合操作...
    99+
    2023-06-15
  • lambda表达式怎么在Java8中使用
    lambda表达式怎么在Java8中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。lambda 表达式的语法lambda 表达式由参数,->,以及函数体三部分组成。其...
    99+
    2023-05-31
    java8 lambda ava
  • 怎么在Java8中使用Lambda表达式
    怎么在Java8中使用Lambda表达式?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. lambda表达式介绍lambda表达式是Java8提供的新特性之一,也可以称之为闭...
    99+
    2023-06-14
  • 如何正确的在Java8中使用lambda表达式
    如何正确的在Java8中使用lambda表达式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.基本介绍lambda表达式,即带有参数的表达式,为了更清晰地理解lambda...
    99+
    2023-05-31
    java8 lambda ava
  • lambda表达式在java8中的使用方法
    这篇文章给大家介绍lambda表达式在java8中的使用方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。定义 TantanitReader:public class TantanitReader { private ...
    99+
    2023-05-31
    java8 lambda ava
  • lambda表达式如何正确的在Java8项目中使用
    这篇文章给大家介绍lambda表达式如何正确的在Java8项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在Java8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来了函数式编程的思想,我...
    99+
    2023-05-31
    java8 lambda ava
  • java8中的lambda表达式简介
    目录Lambda表达式的语法Lambda表达式作用域方法引用指向静态方法的方法引用指向任意类型实例方法的方法引用指向现有对象的实例方法的方法引用构造方法引用lambda与匿名内部类匿...
    99+
    2022-11-13
  • lambda表达式在Java8中的作用有哪些
    本篇文章给大家分享的是有关lambda表达式在Java8中的作用有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.关于JSR335JSR是Java Specificati...
    99+
    2023-05-31
    java8 lambda
  • Java8新特性之Lambda表达式的使用
    目录1. lambda表达式介绍2. lambda表达式的重要特征3. lambda表达式对域外变量的限制4. lambda表达式的优缺点5. lambda表达式的使用场景1. la...
    99+
    2022-11-12
  • Java8中Lambda表达式的理解与应用
    目录简介正文1.lambda的语法2.为啥引入lambda3.什么是函数式接口4.什么是行为参数化5.手写一个函数式接口6.常用的函数式接口7.什么是方法引用8.什么是构造引用9.l...
    99+
    2022-11-13
  • 详解Java8如何使用Lambda表达式进行比较
    目录支持Lambda的基本排序无类型定义的基本排序使用引用静态方法进行排序Sort Extracted Comparators反向排序使用多个条件进行排序使用多个条件排序-组合使用S...
    99+
    2022-11-13
  • 深入浅析Java8中的lambda表达式
    深入浅析Java8中的lambda表达式?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。函数式接口函数式接口(functional interface 也叫功能性接口,其实是同一...
    99+
    2023-05-31
    java8 lambda ava
  • Lambda表达式如何在Android 中使用
    这篇文章给大家介绍Lambda表达式如何在Android 中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.Lambda表达式的基本写法如果想要在 Android 项目中使用 Lambda表达式 或者 Java8...
    99+
    2023-05-31
    android lambda roi
  • lambda表达式如何在java中使用
    这篇文章给大家介绍lambda表达式如何在java中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Lamda表达式λ 希腊字母表中排序第十一位字母,英语名称为Lambda避免匿名内部类定义过多其实质属于函数式 编程...
    99+
    2023-06-14
  • Java8怎么使用Lambda表达式进行比较
    本篇文章为大家展示了Java8怎么使用Lambda表达式进行比较,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在Java 8之前,对集合进行排序需要为排序中使用的比较器 Comparato...
    99+
    2023-06-29
  • java8中lambda表达式的语法是什么
    这篇文章主要介绍“java8中lambda表达式的语法是什么”,在日常操作中,相信很多人在java8中lambda表达式的语法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java8中lambda表达式...
    99+
    2023-07-02
  • 【javaSE】 Lambda表达式与Lambda表达式的使用
    文章目录 🌳Lambda表达式的背景🚩Lambda表达式的语法🚩函数式接口 🎋Lambda表达式的基本使用🎄...
    99+
    2023-09-15
    开发语言 java Lambda表达式 源码
  • java8中的lambda表达式,看这篇绝对够
    目录Lambda表达式特性一、lambda表达式介绍1.1 lambda表达式结构 1.2 常见的Lambda表达式1.3 基本语法1.4 类型检查1.5 类型推断1.6 ...
    99+
    2022-11-13
  • 如何在Java项目中使用lambda表达式
    这期内容当中小编将会给大家带来有关如何在Java项目中使用lambda表达式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java8引入了lambda表达式。lambda表达式并不是新功能,只是为了方便代...
    99+
    2023-05-31
    java lambda ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作