package com.mozi.stream;
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
```java
package com.mozi.stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.IntSummaryStatistics;
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 {
private List<User> userList;
@Before
public void streamNew() {
userList = new ArrayList<User>();
User user1 = new User("小花", 13);
User user2 = new User("大花", 16);
User user3 = new User("小米", 23);
User user4 = new User("大米", 24);
User user5 = new User("張三", 18);
User user6 = new User("李四", 15);
User user7 = new User("王五", 22);
User user8 = new User("李珊珊", 29);
User user9 = new User("朝夕夕", 24);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
userList.add(user6);
userList.add(user7);
userList.add(user8);
userList.add(user9);
}
/**
* 12、使用collect()做字元串joining()
*/
@Test
public void streamCollect() {
Stream<String> stream = Stream.of("張三","李四","王五","趙六");
// 張三李四王五趙六
//String string = stream.collect(Collectors.joining());
//System.out.println(string);
// 張三-李四-王五-趙六
String string2 = stream.collect(Collectors.joining("-"," "," "));
System.out.println(string2);
}
/**
* 11、reduce() :多面手
*/
@Test
public void streamReduce() {
//userList.stream().max(Comparator.comparing(keyExtractor, keyComparator))
Integer reduce = userList.stream().map(user -> user.getAge())
.reduce(10,(x,y) -> x+y);
System.out.println(reduce);
}
/**
* findFirst() :使用該方法擷取第一個元素
*/
@Test
public void streamFindFirst() {
Optional<User> findFirst = userList.stream().findFirst();
User user = findFirst.get();
System.out.println(user);
//Stream<String> map = userList.stream().map(user -> user.getName());
}
// flatMap與map的差別在于 flatMap是将一個流中的每個值都轉成一個個流,然後再将這些流扁平化成為一個流 。
/**
* flatMap():對每個元素執行mapper指定的操作,
* 并用所有mapper傳回的Stream中的元素組成一個新的Stream作為最終傳回結果,
* 通俗易懂就是将原來的stream中的所有元素都展開組成一個新的stream
*/
@Test
public void streamFlatMap() {
List<String> list1 = Arrays.asList("aa","bb","cc");
List<String> list2 = Arrays.asList("dd","ee");
Stream<List<String>> stream = Stream.of(list1,list2);
//stream.flatMap()
}
/**
* 8、map():接收一個方法作為參數,
* 該函數會被應用到每個元素上,并将其映射成一個新的元素
*/
@Test
public void streamMap() {
// userList.stream().map(User::getAge)
// .forEach(System.out::println);
}
/**
* max,min,sum,avg,count 求平均值
*/
@Test
public void StreamArith() {
IntSummaryStatistics num
= userList.stream().
mapToInt(user -> user.getAge())
.summaryStatistics();
System.out.println("總共人數:" + num.getCount());
System.out.println("平均年齡:" + num.getAverage());
System.out.println("最大年齡:" + num.getMax());
System.out.println("最小年齡:" + num.getMin());
System.out.println("年齡之和:" + num.getSum());
}
/**
* demo: 去重+按照年齡大于20以後從小到大+隻取前二
*/
@Test
public void streamDemo() {
List<User> list = userList.stream().distinct()
.filter(user -> user.getAge() > 20)
.sorted(Comparator.comparingInt(User::getAge))
.limit(2L).collect(Collectors.toList());
list.stream().forEach(System.out::println);
}
/**
* distinct(): 使用該方法去重,注意:必須重寫對應泛型的hashCode()和equals()方法
*/
@Test
public void streamDistinct() {
List<User> list = userList.stream().distinct().collect(Collectors.toList());
list.stream().forEach(System.out::println);
}
/**
* skip():與limit互斥,使用該方法跳過元素
*/
@Test
public void streamSkip() {
userList.stream().skip(2L).forEach(System.out::println);
}
/**
* limit():使用該方法截斷(隻保留前幾個資料)
*/
@Test
public void streamLimit() {
userList.stream().limit(2).forEach(System.out::println);
}
@Test
public void StreamFilter() {
// 輸出年齡大于20的人
List<User> list = userList.stream().filter(user -> user.getAge() > 20).collect(Collectors.toList());
list.forEach(user -> System.out.println(user));
}
@Test
public void streamForEach() {
userList.forEach(user -> System.out.println(user));
userList.stream().forEach(System.out::print);
}
@Test
public void streamSorted() {
userList.stream().sorted(Comparator.comparingInt(User::getAge)).forEach(System.out::print);
}
}