User實體類:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
@Data
@AllArgsConstructor
@ToString
public class User {
private String name;
private int age;
}
測試類:
@SpringBootTest
class DemoApplicationTests {
List<User> list = Arrays.asList(
// name,age
new User("張三", 11),
new User("王五", 20),
new User("王五", 91),
new User("張三", 8),
new User("李四", 44),
new User("李四", 44),
new User("李四", 44)
);
@Test
void contextLoads() {
}
/**
* forEach遍歷
*/
@Test
public void testForEach(){
// java 8 前
System.out.println("java 8 前");
for(User user: list){
System.out.println(user);
}
// java 8 lambda
System.out.println("java 8 lambda");
list.forEach(user -> System.out.println(user));
// java 8 stream lambda
System.out.println("java 8 stream lambda");
list.stream().forEach(user -> System.out.println(user));
}
/**
* sorted對Stream中元素按指定規則進行排序
*/
@Test
public void testSort(){
System.out.println("排序前");
list.forEach(user -> System.out.println(user));
System.out.println("排序後");
System.out.println("java 8 前");
Collections.sort(list, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o1.getAge()-o2.getAge();
}
});
for (User user : list) {
System.out.println(user);
}
System.out.println("java 8 stream 方法引用");
list.stream().sorted(Comparator.comparing(User::getAge)).forEach(user -> System.out.println(user));//從小到大排序
list.stream().sorted(Comparator.comparing(User::getAge).reversed()).forEach(user -> System.out.println(user));//從大到小排序
}
@Test
public void testFilter(){
System.out.println("過濾前");
list.forEach(user -> System.out.println(user));
System.out.println("過濾後");
System.out.println("java前");
for (User user : list) {
if(user.getAge()>50){
System.out.println(user);
}
}
System.out.println("java 8 stream");
list.stream().filter(user -> user.getAge()>50).forEach(user -> System.out.println(user));
}
/**
* 從Stream中獲取指定數量的元素
*/
@Test
public void testLimit(){
System.out.println("截斷前");
list.forEach(user -> System.out.println(user));
System.out.println("截斷後");
System.out.println("java 8 前");
for(int i=0;i<3;i++){
System.out.println(list.get(i));
}
System.out.println("java 8 stream");
list.stream().limit(3).forEach(user -> System.out.println(user));
}
/**
* skip 跳過.
*/
@Test
public void testSkip() {
// 跳過前三個元素,從第四個開始輸出
System.out.println("-----跳過前-----");
list.forEach(user -> System.out.println(user));
System.out.println("-----跳過後-----");
// java 8 前
System.out.println("java 8 前");
for (int i = 3; i < list.size(); i++) {
System.out.println(list.get(i));
}
// java 8 stream
System.out.println("java 8 stream");
list.stream().skip(3).forEach(user -> System.out.println(user));
}
/**
* distinct 去重.
*/
@Test
public void testDistinct() {
// 因爲Arrays.asList() 返回的是Arrays的內部類ArrayList,操作remove,add會報錯
List<User> users = new ArrayList(list);
// 爲list去除重複數據
System.out.println("-----去重前-----");
list.forEach(user -> System.out.println(user));
System.out.println("-----去重後-----");
// java 8 前
System.out.println("java 8 前");
for (int i = 0; i < users.size() - 1; i++) {
for (int j = users.size() - 1; j > i; j--) {
if (users.get(j).getAge() == users.get(i).getAge() && users.get(j).getName()
.equals(users.get(i).getName())) {
users.remove(i);
}
}
}
for (User user : users) {
System.out.println(user);
}
// java 8 stream
System.out.println("java 8 stream");
users.stream().distinct().forEach(user -> System.out.println(user));
}
/**
* 去重+按照年齡大於40以後從小到大+只取前二
*/
@Test
public void demo(){
list.stream().distinct().filter(user -> user.getAge()>40).limit(2).sorted(Comparator.comparing(User::getAge)).forEach(user -> System.out.println(user));
}
/**
* 測試計算.
*/
@Test
public void testNum(){
IntSummaryStatistics num = list.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());
}
/**
* map映射
*/
@Test
public void testMap(){
//只要輸出所有人的年齡
list.stream().forEach(user -> System.out.println(user));
System.out.println("映射後");
List<Integer> ages= list.stream().map(user -> user.getAge()).collect(toList());
ages.forEach(age -> System.out.println(age));
//小寫轉大寫
List<String>words = Arrays.asList("aaa","vvvv","cccc");
System.out.println("全部大寫----》");
List<String>collect = words.stream().map(s ->s.toUpperCase()).collect(toList());
collect.forEach(s -> System.out.println(s));
}
/**
* flatMap
*/
@Test
public void testFlatMap(){
//創建一個 裝有兩個泛型爲integer的集合
Stream<List<Integer>> stream = Stream.of(Arrays.asList(1,2,3),Arrays.asList(4,5));
//將兩個合成一個
Stream<Integer> integerStream = stream.flatMap((Function<List<Integer>,Stream<Integer>>)
integers ->integers.stream());
//爲新的集合
List<Integer> collect = integerStream.collect(toList());
System.out.println("新stream大小:"+collect.size());
System.out.println("-----合併後-----");
collect.forEach(o -> System.out.println(o));
}
/**
* findFirst
*/
@Test
public void testFindFist(){
User user = list.stream().findFirst().get();
System.out.println(user);
}
/**
* reduce操作可以實現從一組元素中生成一個值
*/
@Test
public void reduce(){
Optional<User>max = list.stream().reduce((s1,s2) ->s1.getAge() >s2.getAge() ?s1:s2);
User user = max.get();
System.out.println(user);
// 求年齡之和
Integer reduce = list.stream().reduce(0, // 該參數爲初始值
(integer, user1) -> integer + user1.getAge(), // 該參數爲累加器,新元素如何累加
(integer, integer2) -> integer + integer2);// 多個部分如何合併
System.out.println(reduce);
}
/**
* collect
* 引用靜態方法 Integer::sum
* 引用某個對象的方法 list::add
* 引用某個類的方法 String::length
* 引用構造方法 HashMap::new
*/
@Test
public void collect(){
// 將Stream轉換成List或Set
Stream<String> stream = Stream.of("I", "love", "you", "too");
//List<String> list = stream.collect(Collectors.toList());
//Set<String> set = stream.collect(Collectors.toSet());
// 使用toCollection()指定規約容器的類型
//ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));
//HashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));
// 使用Collectors.joining()拼接字符串
//String joined = stream.collect(Collectors.joining());// "Iloveyoutoo"
//String joined = stream.collect(Collectors.joining(","));// "I,love,you,too"
String joined = stream.collect(Collectors.joining(",", "{", "}"));// "{I,love,you,too}"
System.out.println(joined);
}
}