Stream流的使用方式
1、Stream能帮我们做什么?2、创建流3、操作流
1、Stream能帮我们做什么?
1、业务需求:从中找出语文不及格的学生名字,并且按分数从高到低排序
2、传统的实现方式
List
<Paper> failedPapers
= new ArrayList<>();
for (Paper paper
: papers
) {
if (paper
.getClassName().equals("语文")
&& paper
.getScore() < 60) {
failedPapers
.add(paper
);
}
}
Collections
.sort(failedPapers
, new Comparator<Paper>() {
@Override
public int compare(Paper o1
, Paper o2
) {
return o2
.getScore() - o1
.getScore();
}
});
List
<String> failedPaperStudentNames
= new ArrayList<>();
for (Paper failedPaper
: failedPapers
) {
failedPaperStudentNames
.add(failedPaper
.getStudentName());
}
3、使用Java8新特性Stream流
papers
.stream()
.filter(p
-> p
.getClassName().equals("语文")
&& p
.getScore() < 60)
.sorted((p1
, p2
) -> p2
.getScore() - p1
.getScore())
.map(Paper
::getStudentName
)
.collect(Collectors
.toList());
2、创建流
1、对于集合
List
<String> list
=new ArrayList<>();
Stream
<String> stream
= list
.stream();
2、对于数组
String
[] arr
= new String[]{"A", "B", "C"};
Stream
<String> stream
= Arrays
.stream(arr
);
3、操作流
1、中间操作
(
1)filter 过滤
List
<String> list
= Arrays
.asList("AA", "AB", "BC");
list
.stream()
.filter(s
-> s
.startsWith("A"))
.forEach(System
.out
::println
);
(
2)distinct 去重
List
<String> list
= Arrays
.asList("A", "A", "B");
list
.stream()
.distinct()
.forEach(System
.out
::print
);
(
3)limit 截断
List
<String> list
= Arrays
.asList("A", "B", "C");
list
.stream()
.limit(2)
.forEach(System
.out
::print
);
(
4)skip 跳过元素
List
<String> list
= Arrays
.asList("A", "B", "C");
list
.stream()
.skip(2)
.forEach(System
.out
::print
);
(
5)map 将每一个元素映射成一个新的元素
List
<Paper> papers
= Arrays
.asList(
new Paper("小明", "语文", 40),
new Paper("小红", "语文", 80),
new Paper("小蓝", "语文", 50)
);
papers
.stream()
.map(Paper
::getStudentName
)
.forEach(System
.out
::println
);
(
6)anyMatch 如果有一个元素匹配,返回
true
List
<String> list
= Arrays
.asList("A", "B", "C");
list
.stream()
.map(s
-> {
System
.out
.print(s
);
return s
;
})
.anyMatch(s
-> s
.startsWith("B"));
(
7)allMatch 所有元素匹配
List
<String> list
= Arrays
.asList("A", "B", "C");
list
.stream()
.map(s
-> {
System
.out
.println(s
);
return s
;
})
.allMatch(s
-> s
.startsWith("B"));
(
8)nonMatch 所有元素不匹配
List
<String> list
= Arrays
.asList("A", "B", "C");
list
.stream()
.map(s
-> {
System
.out
.println(s
);
return s
;
})
.noneMatch(s
-> s
.startsWith("B"));
2、终端操作
(
1)collect 收集
List
<Paper> papers
= Arrays
.asList(
new Paper("小明", "语文", 40),
new Paper("小明", "数学", 80),
new Paper("小红", "语文", 80),
new Paper("小红", "数学", 80),
new Paper("小蓝", "语文", 50),
new Paper("小蓝", "数学", 60)
);
List
<Paper> chinesePapers
= papers
.stream()
.filter(p
-> p
.getClassName().equals("语文"))
.collect(toList());
Set
<String> classNames
= papers
.stream()
.map(Paper
::getClassName
)
.collect(toSet());
Set
<String> classNames
= papers
.stream()
.map(Paper
::getClassName
)
.collect(counting());
Paper maxScorePaper
= papers
.stream()
.collect(maxBy((p1
, p2
) -> p1
.getScore() - p2
.getScore())).get();
int sumScore
= papers
.stream()
.collect(summingInt(Paper
::getScore
));
double avgScore
= papers
.stream()
.collect(averagingInt(Paper
::getScore
));
IntSummaryStatistics summaryStatistics
= papers
.stream()
.collect(summarizingInt(Paper
::getScore
));
long count
= summaryStatistics
.getCount();
long sum
= summaryStatistics
.getSum();
int max
= summaryStatistics
.getMax();
int min
= summaryStatistics
.getMin();
double avg
= summaryStatistics
.getAverage();
String studentNameStr
= papers
.stream()
.map(Paper
::getStudentName
)
.distinct()
.collect(joining(","));
Map
<String
, List
<Paper>> groupPapers
= papers
.stream()
.collect(groupingBy(Paper
::getClassName
));