c语言sscanf函数的用法是什么
305
2022-12-11
关于JAVA8的 Stream学习
目录一、Stream的使用1.1 创建1.2 步骤二、Stream的特性三、中间操作3.1 filter()3.2 limit()3.3 skip()3.4 map()3.5 sorted四、终止操作4.1 allMatch4.2anyMatch4.3noneMatch4.4 findFirst()4.5 findAny()4.6 count4.7 max4.8 min4.9 forEach4.10 reduce4.11 collect
一、Stream的使用
1.1 创建
通过Collection接口的实现类提供的 stream()方法,或
通过Arrays中的静态方法 stream()获取
通过Stream类中的静态方法 of()
无限流(迭代/生成)
eroWHMfZlb
/**
* @Author: 郜宇博
* @Date: 2021/9/1 23:28
* 流操作
*/
public class StreamTests {
@Test
public void test(){
//1.通过Collection接口的实现类提供的 stream()方法,或
Collection
list.stream();
list.parallelStream();
//2.通过Arrays中的静态方法 stream()获取
Integer[] integers = new Integer[10];
Arrays.stream(integers);
//3.通过Stream类中的静态方法 of()
Stream
//4.无限流
//迭代
Stream
//生成
Stream
}
}
1.1.1并行流parallelStream
parallelStream提供了流的并行处理,它是Stream的另一重要特性,其底层使用Fork/Join框架实现。简单理解就是多线程异步任务的一种实现。
1.2 步骤
创建Stream;
转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换);
对Stream进行聚合(Reduce)操作,获取想要的结果;
二、Stream的特性
惰性求值:
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理!而是在终止操作时一次性全部处理,这种情况称为“惰性求值”。
三、中间操作
筛选与切片
3.1 filter()
接受lambda表达式,从流中排除某些元素
@Test
public void test2(){
//获取一个数组
ArrayList
for (int i = 0; i <10; i++) {
arrayList.add(i);
}
//流操作:获取大于5的
arrayList.stream().filter((num)->num>5).forEach(System.out::println);
}
//结果: 6 7 8 9
3.2 limit()
截断流,使其元素个数不超过一定数量
满足limit的数量后,就短路,不在执行后续操作
@Test
public void test2(){
//获取一个数组
ArrayList
for (int i = 0; i <10; i++) {
arrayList.add(i);
}
//流操作:获取大于5的
arrayList.stream().filter((num)->num>5)
.limit(2)
.forEach(System.out::println);
}
//结果: 6 7
3.3 skip()
跳过元素,跳过前n个元素,执行后面的元素,如果不足n个则返回空流
@Test
public void test2(){
//获取一个数组
ArrayList
for (int i = 0; i <10; i++) {
arrayList.add(i);
}
//流操作:获取大于5的
arrayList.stream().filter((num)->num>5)
.skip(2)
.forEach(System.out::println);
}
//结果: 8 9
3.3 map()
映射,在方法中使用方法Function< T> 函数型接口 -----> R apply(T t);
@Test
public void test4(){
//获取一个list
List
//使用流操作 转化大写
list.stream().map((str)->str.toUpperCase())
.forEach(System.out::println);
}
/*结果:AAA
BBB
CCC*/
@Test
public void test3(){
//获取一个list
List
//流操作: 将list中的元素取出
//第一步使用map取出流,流里存放的还是流
//因此需要二次foreach
Stream
chs.forEach((stream)->{
stream.forEach(System.out::print);
});
}
//将str返回为流对象
public static Stream
List
for (Character character: str.toCharArray()){
list.add(character);
}
return list.stream();
}
//结果:aaabbbccc
3.4 map()
映射,在方法中使用方法Function< T> 函数型接口 -----> R apply(T t);
@Test
public void test4(){
//获取一个list
List
//使用流操作 转化大写
list.stream().map((str)->str.toUpperCase())
.forEach(System.out::println);
}
/*结果:AAA
BBB
CCC*/
@Test
public void test3(){
//获取一个list
List
//流操作: 将list中的元素取出
//第一步使用map取出流,流里存放的还是流
//因此需要二次foreach
Stream
chs.forEach((stream)->{
stream.forEach(System.out::print);
});
}
//将str返回为流对象
public static Stream
List
for (Character character: str.toCharArray()){
list.add(character);
}
return list.stream();
}
//结果:aaabbbccc
3.3.1 flatMap
相当于集合方法的 addAll
即:将流中的流内元素取出,放入一个流中,而不是流内套流
@Test
public void test3(){
//获取一个list
List
//流操作: 将list中的元素取出
//第一步使用map取出流,流里存放的还是流
//因此需要二次foreach
Stream
chs.forEach((stream)-> stream.forEach(System.out::print));
System.out.println("\n=====");
//方法二:
//使用flatMap
list.stream().flatMap(StreamTests::getUpper).forEach(System.out::print);
}
3.5 sorted
@Test
public void test5(){
List
//自然排序
list.stream()
.sorted()
.forEach(System.out::println);
System.out.println("=============");
//定制排序
list.stream()
.sorted((x,y)->{
//如果长度一样,则按照字典排序
if (x.length() == y.length()){
return x.compareTo(y);
}
//如果长度不一样则按照长度的降序排序
else {
return y.length() - x.length();
}
})
.forEach(System.out::println);
}
/*结果:
aaa
bbbb
ccc
eeeee
=============
eeeee
bbbb
aaa
ccc
*/
四、终止操作
查找与匹配
4.1 allMatch
Predicate super T> predicate
/**
* @Author: 郜宇博
* @Date: 2021/9/3 14:00
* 终止操作
*/
public class FinalOperation {
static ArrayList
/**
* allMath 检查是否全部元素符合
*/
@BeforeEach
public void before(){
//准备集合
Student student1 = new Student(10,"张三", Student.Status.Sad);
Student student2 = new Student(20,"李四", Student.Status.Happy);
Student student3 = new Student(30,"王五", Student.Status.Free);
Student student4 = new Student(18,"田七", Student.Status.Free);
Student student5 = new Student(140,"赵六", Student.Status.Tired);
list = new ArrayList<>();
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
list.add(student5);
}
}
class Student{
private int age;
private String name;
private Status status;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public Status getStatus() {
return status;
}
/**
* 枚举状态
*/
public enum Status{
Free,Tired,Happy,Sad;
}
public Student(int age, String name, Status status) {
this.age = age;
this.name = name;
this.status = status;
}
}
/**
* 是否全部年龄都大于20
*/
@Test
public void test1(){
boolean b = list.stream().allMatch((s) -> s.getAge() > 20);
System.out.println(b);
}
//结果: false
4.2anyMatch
Predicate super T> predicate
/**
* 是否存在年龄大于20的
*/
@Test
public void test2(){
boolean b = list.stream().anyMatch((s) -> s.getAge() > 20);
System.out.println(b);
}
//结果:true
4.3noneMatch
Predicate super T> predicate
/**
* 是否没有满足年龄大于20的
*
*/
@Test
public void test3(){
boolean b = list.stream().noneMatch((s) -> s.getAge() > 20);
System.out.println(b);
}
//结果:false
4.4 findFirst()
返回第一元素,但结果可能为null, 因此使用Optional
/**
* 返回第一元素
*/
@Test
public void test4(){
Optional
.filter((e) -> e.getStatus().equals(Student.Status.Free))
.findFirst();
System.out.println(first);
}
//结果:Optional[Student{age=30, name='王五', status=Free}]
4.5 findAny()
返回任意一个
/**
* 返回任意一个
*
*/
@Test
public void test5(){
Optional
.filter((student -> student.getAge()<30))
.findAny();
System.out.println(b.get());
}
//结果: 任意一个年龄小于30的学生
4.6 count
/**
* 获取数量count
*/
@Test
public void test6(){
long count = list.stream().count();
System.out.println(count);
}
//结果 : 5
4.7 max
/**
* 获得最大值
*/
@Test
public void test7(){
Optional
.map(x->x.getAge())
.max(Integer::compare);
System.out.println(max.get());
}
//结果: 140
4.8 min
/**
* 获得最小值
*/
@Test
public void test7(){
Optional
.map(x->x.getAge())
.min(Integer::compare);
System.out.println(max.get());
}
4.9 forEach
@Test
public void test2(){
//获取一个数组
ArrayList
for (int i = 0; i <10; i++) {
arrayList.add(i);
}
//流操作:获取大于5的
arrayList.stream().filter((num)->num>5)
.limit(2)
.forEach(System.out::println);
}
//结果: 6 7
4.10 reduce
/**
* 归纳
*/
@Test
public void test8(){
Integer reduce = list.stream()
.map(Student::getAge)
.reduce(0, (x, y) -> x + y);
System.out.println(reduce);
//方法二:
//此方法有可能为null,因此封装为Optional对象
Optional
.map(Student::getAge)
.reduce(Integer::sum);
System.out.println(reduce1.get());
}
4.11 collect
可以收集为集合类,
可以在收集后进行分组、多级分组、分片
/**
* 收集
*/
@Test
public void test9(){
List
collect.forEach(System.out::println);
//方式二:
HashSet
collect.forEach(System.out::println);
}
/*
结果:Student{age=10, name='张三', status=Sad}
Student{age=20, name='李四', status=Happy}
Student{age=30, name='王五', status=Free}
Student{age=18, name='田七', status=Free}
Student{age=140, name='赵六', status=Tired}
*/
/**
* 使用收集可以计算最大值、最小值、平均值、等
* 也可以进行分组
*/
@Test
public void test10(){
Map
System.out.println(collect.size());
System.out.println(collect);
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~