关于Stream流操作方法总结

什么是Stream流?

Stream流Jdk8开始新增的一套API ,可以流水线式的操作集合或者数组中的数据。

相比起集合和数组零散的方法会更方便,优势: Stream流提供的方法内部可以使用Lambda表达式,还可以链式编程。使得我们操作集合或者数组的代码更简洁,可读性更好。

1、请写出Stream流有哪些中间操作方法,并描述其含义

filter  过滤掉不符合条件的元素
sorted  排序方法
limit     只留limit的前几个元素
skip    跳过前几个元素
map      对集合提取键值对 /?将流中的T元素转换成R元素,并返回对应的新流。
       Map集合 : 1.Map集合名.entrySet.stream().map 只取key,就getKey,只取Value,就getValue
                 2.把键值拼接成字符串,就 Map集合名.entrySet.stream().map(e -> e.getKey()+ ":" + e.getValue())
       List集合 : 直接一对一变形即可 
        只要出现 {},就必须写 return;单行表达式体可省略。
concat   把两个流合并起来,静态方法,需Stream.concat(s1,s2)
distinct: 排除重复元素

2、请写出Stream流有哪些终结操作方法,并描述其含义

max   元素中的最大值(需要comparator),返回optional对象
min   元素中的最小值(需要comparator),返回optional对象
        注意:Stream 根本没有 get() 方法;Optional 才有。所以get可接收max和min
count   计算元素的个数,返回long
forEach 遍历集合或数组元素,而且不能“继续链式”写。

3、请写出Stream流有哪些收集方法,并描述其含义

collect(Collectors.toList) :收集成List单列集合
collect(Collectors.toMap)   :收集成Map双列集合
collect(Collectors.toSet)   :收集成Set集合
toArray :收集成数组,属于Stream自己的终结方法

4.注意事项

Java 的 Stream 接口只对 对象引用流 (Stream<T>) 和 三种基本类型流 (IntStream, LongStream, DoubleStream) 提供 API,而数组本身并不是 Stream,所以:

  1. 不能直接 .stream()

  2. 必须先通过 Arrays.stream(...)Stream.of(...) 把数组变成流,再使用各种中间 / 终结操作。

二、代码

1.练习一

package com.itheima.homework;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Administrator
 * 需求 :  有一个"helloworldjava"字符串,统计该字符串中各个字符的数量,例如程序输出结果:
 * - h-1 e-1 l-3 o-2 w-1 r-1 d-1 j-1 a-2 v-1   (顺序不做要求)
 */
public class Work1 {
    public static void main(String[] args) {
       String s = "yousonofbitch";
        String[] array = s.split("");
        //创建一个空map集合用于存储键值对
        Map<String, Integer> map = new HashMap<>();
        for (String string : array) {
            if(map.containsKey(string)){
                Integer value = map.get(string);
                map.put(string,value+1);
                //todo 为什么写到这里说是不可到达的?
            }else{
                map.put(string,1);
            }
        }
        map.forEach((k,v)-> System.out.print(k+"="+v+" "));
    }
}

2.练习二

package com.itheima.homework;

import java.util.Arrays;

/**
 * @author Administrator
 * 3.对元素按照降序排列
 * 4.截取前面8个
 * 5.跳过前面3个
 * 6.去除重复元素
 * 7.过滤保留偶数元素
 * 8.遍历打印剩余元素
 */
public class Work2 {
    public static void main(String[] args) {
        Integer[] arr = {123,456,777,345,345,222,999,222,110,120,567};
        Arrays.stream(arr)
                .sorted((o1,o2)->o2-o1)
                .limit(8)
                .skip(3)
                .distinct()
                .filter(num->num%2==0)
                .forEach(num-> System.out.println(num));

    }
}

3.练习三

package com.itheima.homework;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author Administrator
 */
public class Work3 {
    public static void main(String[] args) {
        //准备好一个集合
        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1,"金毛狮王","周芷若", "周芷若","张无忌","灭绝师太","灭绝师太","张三丰", "张翠山", "小昭", "赵敏");

        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2,"杨过","小龙女","张三丰", "张翠山", "小昭", "赵敏");

        //1.获取两个集合的流,将两个流合并为一个流
        //todo concat()为静态方法, 所以需要使用Stream.concat(),里面的参数应是流对象
        //todo List可以直接.stream()调用方法,而数组?不同集合使用方法有何不同?
        Stream<String> concated = Stream.concat(list1.stream(), list2.stream());

        //2.过滤姓名长度大于2的元素、截取前面8个、跳过前面1个、去重重复元素
        System.out.println("------------------");
        List<Student> studentList = concated.filter(name -> name.length() > 2)
                //todo filter方法后的条件是需要保留的条件
                .limit(8)
                .skip(1)
                .distinct()
                .map(name -> new Student(name, new Random().nextInt(18, 100)))
                .collect(Collectors.toList());
        System.out.println(studentList);

//                .collect(Collectors.toList());
        //收集成List集合,打印出地址值,怎么打印值?toList打包完需要接收他的结果,笨蛋
//        System.out.println(collect);
        //3 将Stream流中的字符串名字转换成Student对象,对象的年龄取[18,100]之间的随机整数,转换完成之后遍历打印。
    }
}

4.练习四

package com.itheima.homework;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Administrator
 * 3.使用Stream流过滤集合中年龄>20的元素
 * 4.截取前面的8个元素
 * 5.跳过前面的2个元素
 * 6.把Stream流中剩余的元素回收到list集合
 * 7.遍历打印list集合中的学生对象
 */
public class Work4 {
    public static void main(String[] args) {
        List<Student> list=new ArrayList<>();
        list.add(new Student("张三",20));
        list.add(new Student("李四",18));
        list.add(new Student("王五",19));
        list.add(new Student("赵六",25));
        list.add(new Student("王炸",28));
        list.add(new Student("小王",26));
        list.add(new Student("大王",24));
        list.add(new Student("蘑菇头",23));
        list.add(new Student("妹爷",29));
        list.add(new Student("老王",30));
        list.add(new Student("老李",22));
        List<Student> studentList = list.stream()
                .filter(s -> s.getAge() > 20)
                .limit(8)
                .skip(2)
                .collect(Collectors.toList());
        studentList.forEach(s-> System.out.println(s));


    }
}


5.练习五
package com.itheima.homework;

import javax.swing.text.DateFormatter;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.LocalDate;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Scanner;

/**
 * @author Administrator
 *  请键盘录入生日日期(只需要年月日,(如:"1998年08月08日"))
 *  然后计算当前日期距离生日那天间隔多少年?多少月?多少天
 */
public class Work5 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入您的生日日期:(年月日)");
        String next = scanner.next();
//        DateFormatter dateFormatter = DateFormatter.ofPattern("yyyy年MM月dd日");
        //todo 为什么无法创建一个日期的格式化对象?
        //Java 8 引入的日期时间 API 里,负责“模式格式化”的是 DateTimeFormatter,不是 DateFormatter(根本没有这个类)。
        //todo 如何快速生成DateTimeFormmatter
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        //需点击定义中的java让java认
        LocalDate parsed = LocalDate.parse(next, dtf);
        Period period = Period.between(parsed, LocalDate.now());
        int years = period.getYears();
        int months = period.getMonths();
        int days = period.getDays();
        System.out.println("您已经活了"+years+"年"+months+"月"+days+"天");

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值