篩選切片
package cn.wcj.jdk8.lambda.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;
import org.junit.Test;
/*
* 一、Stream API 的操作步驟:
*
* 建立 Stream
*
* 中間操作
*
* 終止操作(終端操作)
*/
public class StreamTest01 {
@Test
public void test1() {
// Collection 提供了兩個方法 stream() 與 parallelStream()
List<String> list=new ArrayList<>() ;
Stream<String> stream=list.stream() ; //順序流
Stream<String> parallelStream = list.parallelStream(); //并行流
// 通過 Arrays 中的 stream() 擷取一個數組流
Integer[] nums=new Integer[] ;
Stream<Integer> stream2 = Arrays.stream(nums) ;
// 通過 Stream 類中靜态方法 of()
Stream<Integer> stream3 = Stream.of(,,,,,) ;
//建立無限流
Stream<Integer> stream4 = Stream.iterate(, (x)->x+).limit();
stream4.forEach(System.out::println) ;
Stream<Double> stream5 = Stream.generate(Math::random).limit() ;
stream5.forEach(System.out::println) ;
}
List<Emp> emps=new ArrayList<Emp>(
Arrays.asList(
new Emp("3333", "張三", , ),
new Emp("4444", "李四", , ),
new Emp("5555", "王五", , ),
new Emp("6666", "趙六", , ),
new Emp("7777", "田七", , ),
new Emp("7777", "田七", , ),
new Emp("7777", "田七", , ),
new Emp("7777", "田七", , ),
new Emp("7777", "田七", , ),
new Emp("7777", "田七", , )
)
);
/*
篩選與切片
filter——接收 Lambda , 從流中排除某些元素。
limit——截斷流,使其元素不超過給定數量。
skip(n) —— 跳過元素,傳回一個扔掉了前 n 個元素的流。若流中元素不足 n 個,則傳回一個空流。與 limit(n) 互補
distinct——篩選,通過流所生成元素的 hashCode() 和 equals() 去除重複元素
*/
//内部疊代:疊代操作 Stream API 内部完成
@Test
public void test2(){
//所有的中間操作不會做任何的處理
Stream<Emp> stream = emps.stream()
.filter((e)->{
System.out.println("中間操作") ;
return e.getAge()> ;
}) ;
//隻有當做終止操作時,所有的中間操作會一次性的全部執行,稱為“惰性求值”
stream.forEach(System.out::println) ;
}
//外部疊代
@Test
public void test3(){
Iterator<Emp> iterator = emps.iterator();
while(iterator.hasNext())
System.out.println(iterator.next()) ;
}
@Test
public void test4(){
emps.stream()
.filter((e)->{
System.out.println("短路") ; //類似&& ||
return e.getSalary()> ;
})
.limit()
.forEach(System.out::println) ;
}
@Test
public void test5(){
emps.stream()
.filter((e)->{
System.out.println("短路") ;
return e.getSalary()> ;
})
.skip()
.forEach(System.out::println);
}
@Test
public void test6(){
emps.stream()
.distinct()
.forEach(System.out::println) ;
}
}
映射、排序
package cn.wcj.jdk8.lambda.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import org.junit.Test;
import cn.wcj.jdk8.lambda.test.Emp.Status;
/**
*
* <p>Title:StreamTest02 </p>
* <p>Description: StreamAPI</p>
* <p>Company:Software College </p>
* @author SuccessKey(WangCJ)
* @date 年月日 下午::
*/
public class StreamTest02 {
List<Emp> emps=new ArrayList<Emp>(
Arrays.asList(
new Emp("3333", "張三", , ,Status.BUSY),
new Emp("4444", "李四", , ,Status.FREE),
new Emp("5555", "王五", , ,Status.VOCATION),
new Emp("6666", "趙六", , ,Status.BUSY),
new Emp("7777", "田七", , ,Status.FREE),
new Emp("7777", "田八", , ,Status.FREE),
new Emp("7777", "田九", , ,Status.BUSY)
)
);
// 中間操作
/*
映射
map——接收 Lambda , 将元素轉換成其他形式或提取資訊。接收一個函數作為參數,該函數會被應用到每個元素上,并将其映射成一個新的元素。
flatMap——接收一個函數作為參數,将流中的每個值都換成另一個流,然後把所有流連接配接成一個流
*/
public static Stream<Character> filterCharacter(String str){
char[] charArray = str.toCharArray();
List<Character> list=new ArrayList<>() ;
for (Character chr : charArray) {
list.add(chr) ;
}
return list.stream() ;
}
@Test
public void test1() {
emps.stream()
.map(Emp::getEname)
.forEach(System.out::println) ;
System.out.println("-----------------------") ;
List<String> strList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
strList.stream()
.map(String::toUpperCase)
.forEach(System.out::println) ;
System.out.println("-----------------------") ;
Stream<Stream<Character>> stream=strList.stream()
.map(StreamTest02::filterCharacter);
stream.forEach((sm)->{
sm.forEach(System.out::println);
});
System.out.println("-----------------------") ;
strList.stream()
.flatMap(StreamTest02::filterCharacter)
.forEach(System.out::println);
}
@Test
public void test2(){
List<String> strList = new ArrayList<>();
strList.add("aaa") ;
strList.add("bbb") ;
strList.add("ccc") ;
strList.add("ddd") ;
strList.add("eee") ;
List strList2 = new ArrayList<>();
strList2.add("fff") ;
strList2.addAll(strList) ;
// strList2.add(strList) ;
System.out.println(strList2);
}
/*
sorted()——自然排序
sorted(Comparator com)——定制排序
*/
@Test
public void test4(){
emps.stream()
.map(Emp::getEname)
.sorted()
.forEach(System.out::println) ;
System.out.println("--------------------") ;
emps.stream()
.sorted((e1,e2)->{
if(e1.getAge()==e2.getAge())
return e1.getEname().compareTo(e2.getEname());
else
return Integer.compare(e1.getAge(), e2.getAge()) ;
})
.forEach(System.out::println) ;
}
/*
allMatch——檢查是否比對所有元素
anyMatch——檢查是否至少比對一個元素
noneMatch——檢查是否沒有比對的元素
findFirst——傳回第一個元素
findAny——傳回目前流中的任意元素
count——傳回流中元素的總個數
max——傳回流中最大值
min——傳回流中最小值
*/
@Test
public void test5(){
boolean allMatch = emps.stream()
.allMatch((e)->e.getStatus().equals(Status.FREE));
System.out.println(allMatch);
boolean anyMatch = emps.stream()
.anyMatch((e)->e.getStatus().equals(Status.FREE)) ;
System.out.println(anyMatch) ;
boolean noneMatch = emps.stream()
.noneMatch((e)->e.getStatus().equals(Status.FREE)) ;
System.out.println(noneMatch) ;
}
@Test
public void test6(){
Optional<Emp> first = emps.stream()
.sorted((e1,e2)->Double.compare(e1.getSalary(), e2.getSalary()))
.findFirst();
System.out.println(first.get()) ;
System.out.println("---------------------");
Optional<Emp> findAny = emps.parallelStream()
.filter((e)->e.getStatus().equals(Status.FREE))
.findAny();
System.out.println(findAny.get());
}
@Test
public void test7(){
long count = emps.stream()
.filter((e)->e.getStatus().equals(Status.FREE))
.count();
System.out.println(count);
Optional<Double> max = emps.stream()
.map(Emp::getSalary)
.max(Double::compare) ;
System.out.println(max.get()) ;
Optional<Emp> min = emps.stream()
.min((e1,e2)->Double.compare(e1.getSalary(), e2.getSalary()));
System.out.println(min.get());
}
}
規約收集
package cn.wcj.jdk8.lambda.test;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.DoubleSummaryStatistics;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import org.junit.Test;
import cn.wcj.jdk8.lambda.test.Emp.Status;
/**
*
* <p>Title:StreamTest </p>
* <p>Description: Stream歸約與收集</p>
* <p>Company:Software College </p>
* @author SuccessKey(WangCJ)
* @date 年月日 下午::
*/
public class StreamTest {
List<Emp> emps=new ArrayList<Emp>(
Arrays.asList(
new Emp("3333", "張三", , ,Status.BUSY),
new Emp("4444", "李四", , ,Status.FREE),
new Emp("5555", "王五", , ,Status.VOCATION),
new Emp("6666", "趙六", , ,Status.BUSY),
new Emp("7777", "田七", , ,Status.FREE),
new Emp("7777", "田七", , ,Status.FREE),
new Emp("7777", "田七", , ,Status.BUSY)
)
);
@Test
public void test1() {
List<Integer> list=Arrays.asList(,,,,,,,,,) ;
Integer sum = list.stream()
.reduce(,(x,y)->x+y) ;
System.out.println(sum);
System.out.println("-------------------") ;
Optional<Double> sum2 = emps.stream()
.map(Emp::getSalary)
.reduce(Double::sum) ;
System.out.println(sum2.get()) ;
}
//統計“六”出現次數
@Test
public void test2(){
Optional<Integer> reduce = emps.stream()
.map(Emp::getEname)
.flatMap(StreamTest02::filterCharacter)
.map((chr)->{
if(chr.equals('六'))
return ;
else
return ;
})
.reduce(Integer::sum) ;
System.out.println(reduce.get()) ;
}
//collect——将流轉換為其他形式。接收一個 Collector接口的實作,用于給Stream中元素做彙總的方法
@Test
public void test3(){
List<String> list = emps.stream()
.map(Emp::getEname)
.collect(Collectors.toList()) ;
list.stream()
.forEach(System.out::println);
System.out.println("----------------------------------") ;
Set<String> set = emps.stream()
.map(Emp::getEname)
.collect(Collectors.toSet()) ;
set.stream()
.forEach(System.out::println) ;
System.out.println("----------------------------------") ;
HashSet<String> hashSet = emps.stream()
.map(Emp::getEname)
.collect(Collectors.toCollection(HashSet::new)) ;
hashSet.stream()
.forEach(System.out::println);
}
@Test
public void test4(){
Optional<Double> collect = emps.stream()
.map(Emp::getSalary)
.collect(Collectors.maxBy(Double::compare)) ;
System.out.println(collect.get()) ;
System.out.println("---------------------------") ;
Optional<Emp> collect2 = emps.stream()
.collect(Collectors.minBy((e1,e2) -> Double.compare(e1.getSalary(), e2.getSalary())));
System.out.println(collect2.get());
System.out.println("---------------------------") ;
Double sum = emps.stream()
.collect(Collectors.summingDouble(Emp::getSalary)) ;
System.out.println(sum) ;
System.out.println("---------------------------") ;
Double avg = emps.stream()
.collect(Collectors.averagingDouble(Emp::getSalary)) ;
System.out.println(avg) ;
System.out.println("---------------------------") ;
Long count = emps.stream()
.collect(Collectors.counting()) ;
System.out.println(count) ;
DoubleSummaryStatistics summaryStatistics = emps.stream()
.collect(Collectors.summarizingDouble(Emp::getSalary)) ;
System.out.println(summaryStatistics.getMax()) ;
}
//分組
@Test
public void test5(){
Map<Status, List<Emp>> collect = emps.stream()
.collect(Collectors.groupingBy(Emp::getStatus));
System.out.println(collect) ;
}
@Test
public void test6(){
Map<Status, Map<String, List<Emp>>> map = emps.stream()
.collect(Collectors.groupingBy(Emp::getStatus, Collectors.groupingBy((e)->{
if(e.getAge()>)
return "老年" ;
else if(e.getAge()>)
return "中年" ;
else
return "成年" ;
}))) ;
System.out.println(map);
}
//分區
@Test
public void test7(){
Map<Boolean, List<Emp>> collect = emps.stream()
.collect(Collectors.partitioningBy((e)->e.getSalary() >= ));
System.out.println(collect);
}
@Test
public void test8(){
String string = emps.stream()
.map(Emp::getEname)
.collect(Collectors.joining(","));
System.out.println(string);
String string2 = emps.stream()
.map(Emp::getEmpno)
.collect(Collectors.joining(",", "工号:(", ")")) ;
System.out.println(string2);
}
@Test
public void test9(){
Optional<Double> collect = emps.stream()
.map(Emp::getSalary)
.collect(Collectors.reducing(Double::sum)) ;
System.out.println(collect.get()) ;
}
}
StreamAPI練習
package cn.wcj.jdk8.lambda.exam ;
import static org.junit.Assert.*;
import org.junit.Test;
public class Trader {
private String name;
private String city;
public Trader() {
}
public Trader(String name, String city) {
this.name = name;
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Trader [name=" + name + ", city=" + city + "]";
}
}
package cn.wcj.jdk8.lambda.exam;
public class Transaction {
private Trader trader;
private int year;
private int value;
public Transaction() {
}
public Transaction(Trader trader, int year, int value) {
this.trader = trader;
this.year = year;
this.value = value;
}
public Trader getTrader() {
return trader;
}
public void setTrader(Trader trader) {
this.trader = trader;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
@Override
public String toString() {
return "Transaction [trader=" + trader + ", year=" + year + ", value="
+ value + "]";
}
}
package cn.wcj.jdk8.lambda.exam;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Before;
import org.junit.Test;
public class StreamTest {
List<Transaction> transactions = null;
@Before
public void before(){
//交易員
Trader raoul = new Trader("Raoul", "Cambridge");
Trader mario = new Trader("Mario", "Milan");
Trader alan = new Trader("Alan", "Cambridge");
Trader brian = new Trader("Brian", "Cambridge");
//交易
transactions = Arrays.asList(
new Transaction(brian, , ),
new Transaction(raoul, , ),
new Transaction(raoul, , ),
new Transaction(mario, , ),
new Transaction(mario, , ),
new Transaction(alan, , )
);
}
// 找出年發生的所有交易, 并按交易額排序(從低到高)
@Test
public void test1() {
transactions.stream()
.filter((t)->t.getYear()==)
.sorted((x,y)->Integer.compare(x.getValue(), y.getValue()))
.forEach(System.out::println);
}
//2. 交易員都在哪些不同的城市工作過?
@Test
public void test2(){
transactions.stream()
.map(t->t.getTrader().getCity())
.distinct()
.forEach(System.out::println) ;
}
//3. 查找所有來自劍橋的交易員,并按姓名排序
@Test
public void test3(){
transactions.stream()
.filter(t->"Cambridge".equals(t.getTrader().getCity()))
.sorted((t1,t2)->t1.getTrader().getName().compareTo(t2.getTrader().getName()))
.forEach(System.out::println);;
}
//4. 傳回所有交易員的姓名字元串,按字母順序排序
@Test
public void test4(){
transactions.stream()
.map((t)->t.getTrader().getName())
.distinct()
.sorted()
.forEach(System.out::println) ;
System.out.println("--------------------") ;
String names = transactions.stream()
.map((t)->t.getTrader().getName())
.distinct()
.sorted()
.collect(Collectors.joining(",")) ;
System.out.println(names) ;
System.out.println("--------------------") ;
String reduce = transactions.stream()
.map((t)->t.getTrader().getName())
.sorted()
.reduce("",String::concat) ;
System.out.println(reduce);
System.out.println("--------------------") ;
transactions.stream()
.map((t)->t.getTrader().getName())
.distinct()
.flatMap(StreamTest::filterCharacter)
.sorted(String::compareToIgnoreCase)
.forEach(System.out::print) ;
}
public static Stream<String> filterCharacter(String str){
List<String> list=new ArrayList<>() ;
for (Character chr : str.toCharArray())
list.add(chr.toString()) ;
return list.stream() ;
}
//5. 有沒有交易員是在米蘭工作的?
@Test
public void test5(){
boolean match = transactions.stream()
.anyMatch((t)->"Milan".equals(t.getTrader().getCity()));
System.out.println(match?"有":"沒有");
}
//6. 列印生活在劍橋的交易員的所有交易額
@Test
public void test6(){
transactions.stream()
.filter((t)->"Cambridge".equals(t.getTrader().getCity()))
.map(Transaction::getValue)
.forEach(System.out::println) ;
}
//7. 所有交易中,最高的交易額是多少
@Test
public void test7(){
DoubleSummaryStatistics collect = transactions.stream()
.collect(Collectors.summarizingDouble(Transaction::getValue));
System.out.println(collect.getMax());
}
//8. 找到交易額最小的交易
@Test
public void test8(){
Optional<Integer> min = transactions.stream()
.map(Transaction::getValue)
.min((v1,v2) -> Integer.compare(v1, v2)) ;
System.out.println(min.get());
}
}