首先定義一個測試對象
//POJO, Person對象
public class Person {
private String name;
private int weight;
public Person(String name, int weight) {
super();
this.name = name;
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name+" : "+ weight +" KG ";
}
public boolean isOverweight() {
return weight>;
}
@Override
public boolean equals(Object target) {
// TODO Auto-generated method stub
return name.equals(((Person)target).getName());
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return name.hashCode();
}
}
測試代碼
public class Demo {
public static void main(String[] args) {
List<Person> source = Arrays.asList(new Person("Li Lei", ), new Person("Li Lei", ),
new Person("Han Meimei", ), new Person("Xiao wang", ), new Person("Xiao zhang", ));
//原始資料列印
System.out.println("原始資料列印 : ");
source.stream().forEach(System.out::println);
//Li Lei : KG
//Li Lei : KG
//Han Meimei : KG
//Xiao wang : KG
//Xiao zhang : KG
// 用謂詞篩選 filter
System.out.println("用謂詞篩選 : ");
source.stream().filter(Person::isOverweight).forEach(System.out::println);
//Li Lei : KG
//Li Lei : KG
//Xiao wang : KG
// 篩選各異的元素 distinct
System.out.println("篩選各異的元素: ");
source.stream().filter(Person::isOverweight).distinct().forEach(System.out::println);
//Li Lei : KG
//Xiao wang : KG
// 截短流 limit
System.out.println("截短流: ");
source.stream().filter(Person::isOverweight).distinct().limit().forEach(System.out::println);
//Li Lei : KG
// 跳過元素 skip
System.out.println("跳過元素: ");
source.stream().filter(Person::isOverweight).distinct().skip().forEach(System.out::println);
//Xiao wang : KG
// 排序 sorted
System.out.println("根據體重排序: ");
source.stream().sorted(Comparator.comparingInt(Person::getWeight)).forEach(System.out::println);
//Xiao zhang : KG
//Han Meimei : KG
//Xiao wang : KG
//Li Lei : KG
//Li Lei : KG
System.out.println("根據體重倒序并儲存到另外List中: ");
List<Person> target = source.stream().sorted(Comparator.comparing(Person::getWeight).reversed()).collect(Collectors.toList());
System.out.println(Arrays.toString(target.toArray()));
//[Li Lei : KG , Li Lei : KG , Xiao wang : KG , Han Meimei : KG , Xiao zhang : KG ]
// 求總數count
long count= source.stream().count();
System.out.println("總數 : " +count);
//總數 :
// 查找至少比對一個 anyMatch
boolean result = source.stream().anyMatch(Person::isOverweight);
System.out.println("查找至少比對一個(>80)的結果 : " + result);
//查找至少比對一個(>)的結果 : true
// 查找全部比對 allMatch
boolean result2 = source.stream().allMatch(Person::isOverweight);
System.out.println("查找全部比對(>80)的結果 : " + result2);
//查找全部比對(>)的結果 : false
// 查找沒有一個比對 noneMatch
boolean result3 = source.stream().noneMatch(Person::isOverweight);
System.out.println("查找沒有一個比對(>80)的結果 : " + result3);
//查找沒有一個比對(>)的結果 : false
// 查找元素 findAny findFirst (采用parallelStream 代替Stream,用來展示以下兩個方法在并行下傳回結果可能不同)
System.out.println("查找任意滿足的一個元素 : " + result);
source.parallelStream().filter(Person::isOverweight).findAny().ifPresent(System.out::println);
System.out.println("查找第一個滿足的元素 : " + result);
source.parallelStream().filter(Person::isOverweight).findFirst().ifPresent(System.out::println);
//查找任意滿足的一個元素 : true
//Xiao wang : KG
//查找第一個滿足的元素 : true
//Li Lei : KG
// 映射 map
System.out.println("映射: ");
source.stream().filter(Person::isOverweight).distinct().map(Person::getName).forEach(System.out::println);
//Li Lei
//Xiao wang
// 流的扁平化 flatmap
System.out.println("輸出名字包含的單詞(不用flatmap): ");
source.stream().filter(Person::isOverweight).distinct().map(person -> person.getName().split(" "))
.forEach((String[] values) -> System.out.println(Arrays.toString(values)));
// [Li, Lei]
// [Xiao, wang]
System.out.println("輸出名字包含的單詞(采用flatmap): ");
source.stream().filter(Person::isOverweight).distinct().map(person -> person.getName().split(" "))
.flatMap(Arrays::stream).forEach(System.out::println);
//Li
//Lei
//Xiao
//wang
// 規約 reduce
// 求和
System.out.println("求和: ");
source.parallelStream().mapToInt(Person::getWeight).reduce(Integer::sum).ifPresent(System.out::println);
//
// 最大值最小值
System.out.println("最大值: ");
source.parallelStream().mapToInt(Person::getWeight).reduce(Integer::max).ifPresent(System.out::println);
//
System.out.println("最小值: ");
source.parallelStream().mapToInt(Person::getWeight).reduce(Integer::min).ifPresent(System.out::println);
//
//IntStream
System.out.println("展示IntStream: ");
IntStream.rangeClosed(, ).forEach(System.out::println);
//
//
//
//
//檔案流
System.out.println("從檔案中讀取流: ");
//Stream<String> lines=Files.lines(Paths.get("d:/test.txt")
try(Stream<String> lines=new BufferedReader(new InputStreamReader(Demo.class.getResourceAsStream("/test.txt"))).lines()){
lines.forEach(System.out::println);
}catch (Exception e) {
e.printStackTrace();
}
//This is the first Line;
//This is the Second Line;
}
}
完整運作結果:
原始資料列印 :
Li Lei : 90 KG
Li Lei : 92 KG
Han Meimei : 60 KG
Xiao wang : 82 KG
Xiao zhang : 50 KG
用謂詞篩選 :
Li Lei : 90 KG
Li Lei : 92 KG
Xiao wang : 82 KG
篩選各異的元素:
Li Lei : 90 KG
Xiao wang : 82 KG
截短流:
Li Lei : 90 KG
跳過元素:
Xiao wang : 82 KG
根據體重排序:
Xiao zhang : 50 KG
Han Meimei : 60 KG
Xiao wang : 82 KG
Li Lei : 90 KG
Li Lei : 92 KG
根據體重倒序并儲存到另外List中:
[Li Lei : 92 KG , Li Lei : 90 KG , Xiao wang : 82 KG , Han Meimei : 60 KG , Xiao zhang : 50 KG ]
總數 : 5
查找至少比對一個(>80)的結果 : true
查找全部比對(>80)的結果 : false
查找沒有一個比對(>80)的結果 : false
查找任意滿足的一個元素 : true
Xiao wang : 82 KG
查找第一個滿足的元素 : true
Li Lei : 90 KG
映射:
Li Lei
Xiao wang
輸出名字包含的單詞(不用flatmap):
[Li, Lei]
[Xiao, wang]
輸出名字包含的單詞(采用flatmap):
Li
Lei
Xiao
wang
求和:
374
最大值:
92
最小值:
50
展示IntStream:
1
2
3
4
從檔案中讀取流:
This is the first Line;
This is the Second Line;
Github源碼
Eclipse工程源碼