什么是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,所以:
-
不能直接
.stream() -
必须先通过
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+"天");
}
}
1252

被折叠的 条评论
为什么被折叠?



