首页 > 编程语言 >Java流Stream使用详解(中)

Java流Stream使用详解(中)

时间:2023-12-02 14:03:39浏览次数:41  
标签:Java String Stream list System 详解 println out

一、Stream流的中间方法

名称

说明

Stream<T> filter(Predicate<?super T> predicate)

过滤

Stream<T> limit(long maxSize)

获取前几个元素

Stream<T> skip(long n)

跳过前几个元素

Stream<T> distinct()

元素去重,依赖(hashCode和equals方法)

static <T> Stream<T> concat(Stream a,Stream b)

合并a和b两个流为一个流

Stream<R> map(Function<T,R>mapper)

转换流中的数据类型

l 注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程

l 注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据

(一)方法filter、limit及skip的使用示例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;

public class StreamMiddle1 {
    public static void main(String[] args) {
        // 创建列表并添加元素
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰","张翠山","张良","王二麻子","谢广坤");

        // filter 过滤 把"张"开头的留下, 其余数据过滤不要
        list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                // test方法的返回值如果为true,表示当前数据留下
                // 如果返回值为false,表示当前数据舍弃不要
                boolean result = s.startsWith("张");
                return result;
            }
        }).forEach(s -> System.out.println(s));

        System.out.println("++++++++++++++++");

        // limit 获取前几个元素
        // 打印前三个元素
        list.stream().limit(3).forEach(s -> System.out.println(s));

        System.out.println("++++++++++++++++");

        // skip 跳过几个元素
        // 跳过前4个元素
        list.stream().skip(4).forEach(s -> System.out.println(s));

        System.out.println("++++++++++++++++");

        // 打印中间的三个名字
        list.stream().limit(6).skip(3).forEach(s -> System.out.println(s));
    }
}

(一)方法distinct和concat使用示例

import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;

public class StreamMiddle2 {
    public static void main(String[] args) {
        /*
         * distinct 元素去重,依赖hashCode和equals方法
         * concat 合并a和b两个流为一个流
         */

        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"张无忌","张无忌","张无忌","张强","张三丰","张翠山","张良","王二麻子","谢广坤");
        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2,"周芷若","赵敏");

        // 去重
        list1.stream().distinct().forEach(s -> System.out.println(s));

        System.out.println("+++++++++++++++");

        // 合并2个流,使用Stream.concat方法
        Stream.concat(list1.stream(), list2.stream()).forEach(s -> System.out.println(s));
    }
}

(二)方法map的使用示例

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;

public class StreamMiddle3 {
    public static void main(String[] args) {
        /*
        map
        转换流中的数据类型

        注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
        注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
        */

        ArrayList<String> list =new ArrayList<>();
        Collections.addAll(list,"张无忌-15","周芷若-14","赵敏-13","张强-20","张三丰-100","张翠山-40","张良-35","王二麻子-37");
        //只获取里面的年龄并进行打印
        //String->int

        //第一个类型:流中原本的数据类型
        //第二个类型:要转成之后的类型

        //apply的形参s:依次表示流里面的每一个数据
        //返回值:表示转换之后的数据
        list.stream().map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                String[] arr = s.split("-");
                String ageString = arr[1];
                int age = Integer.parseInt(ageString);
                return age;
            }
        }).forEach(s -> System.out.println(s));
        // 上面方法体可以改成lambda表达式形式,如下:
        list.stream()
                .map(s -> Integer.parseInt(s.split("-")[1]))
                .forEach(s -> System.out.println(s));
    }
}

二、Stream流的终结方法

名称

说明

void forEach(Consumer action)

遍历

long count()

统计

toArray()

收集流中的数据,放到数组中

collect(Collector collector)

收集流中的数据,放到集合中

示例代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.function.IntFunction;

public class StreamDemo9 {
    public static void main(String[] args) {
        /*
        void forEach(Consumer action)   遍历
        long count()                    统计
        toArray()                       收集流中的数据,放到数组中
        */

        // 创建数组
        ArrayList<String> list =new ArrayList<>();
        // 添加元素
        Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰","张翠山","张良","王二麻子","谢广坤");

        // 遍历
        list.stream().forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        System.out.println("++++++++++++++");

        // 统计
        long count = list.stream().count();
        System.out.println(count);

        System.out.println("++++++++++++++");

        // toArray数组:收集流中的数据,放到数组中
        //
        /*
        Object[] array = list.stream().toArray();
        System.out.println(array);
        for (Object o : array) {
            System.out.println(o);
        }
        */

        // IntFunction的泛型: 具体类型的数组
        // apply的形参:流中数据的个数,要跟数组的长度保持一致,把Object改成String
        // apply的返回值:具体类型的数组
        // 方法体:创建数组
        /*
        String[] arr = list.stream().toArray(new IntFunction<String[]>() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });

        System.out.println(Arrays.toString(arr));
        */

        // 或者也可以简写,如下:
        String[] arr2 = list.stream().toArray(value -> new String[value]);
        System.out.println(Arrays.toString(arr2));
        
    }
}

标签:Java,String,Stream,list,System,详解,println,out
From: https://blog.51cto.com/tangxiaohu/8655007

相关文章

  • Java预科
    Java预科一、学会用MarkDown语法在文本编辑器Typora上总结和思考学过的知识发到博客上面。​博客推荐使用博客园,直接搜typora下载即可。新建文件夹“MarkDown学习”☞新建文本.txt☞改文件后缀xxx.md即可。二、MarkDown语法,先学会语法,再学快捷键。(标题)一个“#”为......
  • 走进Java
    day1走进Java对于新手零基础的我想对自己说:​对于零基础的人学习Java这件事来说其实任何困难都不怕,比如总有人会问英语不好/理解慢/现在学晚不晚,其实持之以恒才是最关键的!没有坚持,一切学习都是白谈。​坚持的重要性不止在学习Java这条路上尤为关键,在其他方面的学习也是一样......
  • 初始Java
    初始Java1.编程语言发展史机器语言汇编语言高级语言2.Java发展史3.Java体系结构JavaSEJavaEEJavaME4.Java的特性和优势跨平台/可移植性安全性面向对象简单性高性能分布式多线程健壮性5.Java核心机制_垃圾收集机制1.不再使......
  • Java并发(十六)----线程八锁
    所谓的“线程八锁”其实就是看synchronized锁住的是哪个对象情况1:12或21都是有可能的,就看cpu先调度哪个线程@Slf4j(topic="c.Number")classNumber{  publicsynchronizedvoida(){    log.debug("1"); }  publicsynchronizedvoidb(){......
  • 【JavaSE】一些常见API(Object、Objects、Math、System、BigDecimal、包装类、Arrays)
    Object类Object类介绍toString方法直接println(对象名),默认会自动调用(对象名.toString),而.toString默认是返回地址信息->全类名(包名+类名)@地址的十六进制哈希值,因此如果println(对象名)控制台没有输出地址值,说明该类一定重写了Object类的toString方法,比如String类和Arr......
  • Java学习之路(十)
    Java学习之路(十)1、接口1.1、信息管理系统集合改进(应用)使用数组容器的弊端容器长度是固定的,不能根据添加功能自动增长没有提供用于赠删改查的方法优化步骤创建新的StudentDao类,OtherStudentDao创建ArrayList集合容器对象OtherStudentDao中的方法声明,需要跟......
  • java集合框架(二)之LinkedList的常见使用
     常用的方法定义LinkedList对象  新增  删除 获取元素 修改 ......
  • java集合框架(二)LinkedList的常见使用
    LinkedList常用方法定义LinkedList对象LinkedList<String>list=newLinkedList<>(); 插入元素list.push("张三");//在此列表的前面插入元素list.addLast("新增到最后一个元素");//将指定的元素追加到此列表的末尾。list.addFirst("新增到第......
  • java集合框架(三)之ArrayList的常见使用
      常见方法语句  三种输出语法  for循环输出   迭代器输出  foreach循环输出   ......
  • Java使用三种方式循环输出Map集合
    先新建一个Map集合 1、通过entrySet获取到键值实现对象 2、通过keySet()获取键值的集合获取值3、迭代器 ......