java1.8 新特性(五 如何使用filter,limit ,skip ,distinct map flatmap ,collect 操作 java集合)

  1. 使用filter 根据 条件筛选 出结果:例如 找出 user 中 age >=15 的用户

    package lambda.stream;
    /**
    * @author 作者:cb
    * @version 创建时间:2019年1月4日 下午2:35:05 
    
    */
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class StreamDemo {
        public static void main(String[] args) {
            // 1.集合创建stream对象
            List<User> asList = Arrays.asList(new User("张三", 15), new User("李四", 25), new User("Tom", 10));
            Stream<User> streamList = asList.stream();
            // 找出 user age>15 的user collect(Collectors.toList()) 返回一个对应的集合 
            List<User> collect = streamList.filter(user -> user.getAge() >= 15).collect(Collectors.toList());       //集合提供的遍历方法。。打印user对象
            collect.forEach(user -> System.out.println(user));
        }
    
    }
    public interface Stream<T> extends BaseStream<T, Stream<T>> {
    
        /**
         * Returns a stream consisting of the elements of this stream that match
         * the given predicate.
         *
         * <p>This is an <a href="package-summary.html#StreamOps">intermediate
         * operation</a>.
         *
         * @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
         *                  <a href="package-summary.html#Statelessness">stateless</a>
         *                  predicate to apply to each element to determine if it
         *                  should be included
         * @return the new stream
         */
        Stream<T> filter(Predicate<? super T> predicate);
     Stream<T> filter(Predicate<? super T> predicate) 接受的是一个 predicate 类型的接口参数。predicate 有一个test 的抽象boolean类型的返回值方法。该方法满足条件age>=15 返回true 则程序 向下执行,执行结果:
    
    User [name=张三, age=15]
    User [name=李四, age=25]

    为了方便 所以 该测试类 每个步骤分开写的,连着写:

    package lambda.stream;
    /**
    * @author 作者:cb
    * @version 创建时间:2019年1月4日 下午2:35:05 
    
    */
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class StreamDemo {
        public static void main(String[] args) {
            // 1.集合创建stream对象
            List<User> asList = Arrays.asList(new User("张三", 15), new User("李四", 25), new User("Tom", 10));
            Stream<User> streamList = asList.stream();
            // 找出 user age>15 的user .collect(Collectors.toList()) 返回一个对应的集合
            // List<User> collect = streamList.filter(user -> user.getAge() >=
            // 15).collect(Collectors.toList());
            // 集合提供的遍历方法。。打印user对象
            // collect.forEach(user -> System.out.println(user));
            streamList.filter(user -> user.getAge() >= 15).collect(Collectors.toList())
                    .forEach(user -> System.out.println(user));
        }
    
    }
  2. 使用stream distinct 去掉一个集合中的重复元素“:
    package lambda.stream;
    /**
    * @author 作者:cb
    * @version 创建时间:2019年1月4日 下午2:35:05 
    
    */
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class StreamDemo {
        public static void main(String[] args) {
            testDistinct();
        }
    
        /**
         * 去重
         */
        public static void testDistinct() {
            List<Integer> asList = Arrays.asList(1, 2, 3, 5, 6, 7, 8, 8, 9, 7);
            List<Integer> collect = asList.stream().distinct().collect(Collectors.toList());
            collect.forEach(System.out::print);
        }
    
    }

    结果:

    12356789
  3. 指定跳过多少个数据 类似 于 for循环里面的break 例如:
    package lambda.stream;
    /**
    * @author 作者:cb
    * @version 创建时间:2019年1月4日 下午2:35:05 
    
    */
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class StreamDemo {
        public static void main(String[] args) {
            testSkp();
        }
    
        public static void testSkp() {
            List<Integer> asList = Arrays.asList(1, 2, 3, 5, 6, 7, 8, 9);
            List<Integer> collect = asList.stream().skip(5).collect(Collectors.toList());
            collect.forEach(System.out::print);
        }

    结果:

    789
  4. 取一个集合的前几条数据
    package lambda.stream;
    /**
    * @author 作者:cb
    * @version 创建时间:2019年1月4日 下午2:35:05 
    
    */
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class StreamDemo {
        public static void main(String[] args) {
            testLimit();
        }
    
        public static void testLimit() {
            List<Integer> asList = Arrays.asList(1, 2, 3, 5, 6, 7, 8, 9);
            List<Integer> collect = asList.stream().limit(5).collect(Collectors.toList());
            collect.forEach(System.out::print);
        }

    结果:

    12356
  5. 使用map 將集合中的每个数字 扩大 两倍 :
    package lambda.stream;
    /**
    * @author 作者:cb
    * @version 创建时间:2019年1月4日 下午2:35:05 
    
    */
    
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class StreamDemo {
        public static void main(String[] args) {
            testMap();
        }
    
        public static void testMap() {
            List<Integer> asList = Arrays.asList(1, 2, 3, 5, 6, 7, 8, 9);
            List<Integer> collect = asList.stream().map(i -> i * 2).collect(Collectors.toList());
            collect.forEach(System.out::println);
        }

    结果:

    2
    4
    6
    10
    12
    14
    16
    18

6 .解决一个字符串数组  返回单一的字符串使用flatMap:

package lambda.stream;
/**
* @author 作者:cb
* @version 创建时间:2019年1月4日 下午2:35:05 

*/

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamDemo {
    public static void main(String[] args) {
        flatMap();
    }

    public static void flatMap() {
        List<String> list = Arrays.asList("AABBBACCDED", "EDADCAJIONG ");

        list.stream().flatMap(item -> Arrays.stream(item.split(""))).distinct().collect(Collectors.toList())
                .forEach(System.out::printf);

结果:

ABCDEJIONG 

关于 map 和 flatMap的区别,可以了解一下。这里记录一下自己的用法 毕竟写这些 主要是给自己看 怕自己哪天忘了  回头在看看

原文地址:https://www.cnblogs.com/920913cheng/p/10234570.html

时间: 2024-08-24 09:26:31

java1.8 新特性(五 如何使用filter,limit ,skip ,distinct map flatmap ,collect 操作 java集合)的相关文章

java1.8新特性(一)

一直在更新java 版本,原来也没有关注java版本的变化 引入的一些新的api  引起注意的还是  关于一些并发包的使用,那时候才对每个版本的特性 去了解了一下,虽然 不一定都用上了,但是不管学习什么语言,花点时间学习新的api还是很有必要的,在工作中 还用一些 1.8的新特性,但是 始终 是 不明白.总是有问题,特意花些时间 去重点学习一下,如果其中 有什么说的不对,请一定要提出来! 用户 对象 User: package com.java; public class User { Stri

了解Java1.8新特性

前几天电脑上的JDK自动更新到1.8,这两天了解了一下JDK1.8的一些新特性.下面就来浅谈一下我所了解的. 我们都知道,Java是不能多继承的,但是可以多实现.它与C++不同,C++是可以多继承的.尽管Java可以实现多个接口,但是接口中只能有抽象方法,不能有具体的实现.但是在JDK1.8中,接口里新增了默认方法.可以对默认方法进行具体的实现,但是这个方法必须是default.看下面这段代码: 1 interface AA{ 2 public int add(int a,int b); //申

java1.4升级到java1.5 新特性

前几天和一位腾讯的技术大牛聊天,聊到关于jdk的很多支持,包括jvm的优化,gc的调用机制,1.4-到1.8每次升级版本的新特性等,做软件这行这么多年了,一直在使用java,但是却从来没有细细的研究每个版本新特性到底有什么不同,所以特意编写了这么一篇文档,让自己能了解些他们的新特性,也共享一下新特性的改变,当然我下面的验证并不能当做最官方的,但最起码我是一个一个实验了,如果存在问题或解释的不正确的,也劳烦各位大牛给予指正. 目前我下载的jdk版本,如果大家需要这些版本的话,后期我会上传到百度云上

Java1.8新特性

1.Lambda表达式和函数式接口 Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变.它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念.很多JVM平台上的语言(Groovy.Scala等)从诞生之日就支持Lambda表达式,但是Java开发者没有选择,只能使用匿名内部类代替Lambda表达式. Lambda的设计耗费了很多时间和很大的社区力量,最终找到一种折中的实现方案,可以实现简洁而紧凑的语言结构.最简单的Lambda表

HTML5 十大新特性(五)——SVG绘图

相对于canvas绘图,SVG是一种绘制矢量图的技术.全称叫做Scalable Vector Graphics,可缩放的矢量图,在2000年就已经存在,H5把它纳入了标准标签库,并进行了一些瘦身.需要注意的是,SVG图形的属性不属于HTML DOM标准,需要用核心DOM的方法来操作:SVG的样式可以用css,但是只能用其专有的属性:如果要使用js动态生成SVG其中的元素,创建方法得用document.createElementNS('http://www.w3.org/2000/svg','标签

java1.8新特性(optional 使用)

经常在程序中出现 java.lang.NullPointerException  为了避免  报错,总是要进行一些 是否为null 的if else 判断 ,1.8 可以使用optional 类 来简化处置   optional :A container object which may or may not contain a non-null value.:可能包含也可能不包含非空值的容器对象. 既然optional 是一个容器对象,那就应该先创建该 对象 才能调用该对象的一些方法 创建op

java1.8 新特性(关于 match,find reduce )操作

match处理Integer集合 package lambda.stream; /** * @author 作者:cb * @version 创建时间:2019年1月4日 下午2:35:05 */ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamDemo { public st

JAVA JDK1.5-1.9新特性

JAVA JDK1.5-1.9新特性 1.5 1.自动装箱与拆箱: 2.枚举(常用来设计单例模式) 3.静态导入 4.可变参数 5.内省 1.6 1.Web服务元数据 2.脚本语言支持 3.JTable的排序和过滤 4.更简单,更强大的JAX-WS 5.轻量级Http Server 6.嵌入式数据库 Derby 1.7 1,switch中可以使用字串了 2.运用List tempList = new ArrayList<>(); 即泛型实例化类型自动推断 3.语法上支持集合,而不一定是数组 4

Java JDK1.5、1.6、1.7新特性整理(转)

原文链接:http://www.cnblogs.com/tony-yang-flutter/p/3503935.html 一.Java JDK1.5的新特性 1.泛型: List<String> strs = new ArrayList<String>();//给集合指定存入类型,上面这个集合在存入数据的时候必须存入String类型的数据,否则编译器会报错 2.for-each 例如上面这个集合我们可以通过for-each遍历,这样更加简单清晰 for(String s : str