Java使用Stream API對(duì)于數(shù)據(jù)列表經(jīng)常處理
先提供一些簡(jiǎn)單到復(fù)雜的常見(jiàn)例子,您可以根據(jù)這些例子進(jìn)行進(jìn)一步的開(kāi)發(fā)和學(xué)習(xí):
數(shù)據(jù)過(guò)濾篩選操作
- 查詢(xún)表中所有數(shù)據(jù):
List<User> users = userDao.getAllUsers();
- 根據(jù)條件查詢(xún)單個(gè)結(jié)果:
Optional<User> user = userDao.getUserById(userId);
- 根據(jù)條件查詢(xún)多個(gè)結(jié)果,并取前幾條:
List<User> topUsers = userDao.getTopUsersByScore(10);
- 對(duì)查詢(xún)結(jié)果進(jìn)行排序:
List<User> sortedUsers = userDao.getAllUsers()
.stream()
.sorted(Comparator.comparing(User::getScore))
.collect(Collectors.toList());
- 過(guò)濾符合條件的結(jié)果:
List<User> filteredUsers = userDao.getAllUsers()
.stream()
.filter(user -> user.getAge() >= 18)
.collect(Collectors.toList());
- 對(duì)查詢(xún)結(jié)果進(jìn)行分頁(yè):
int pageSize = 10;
int pageNum = 1;
List<User> pageUsers = userDao.getAllUsers()
.stream()
.skip((pageNum - 1) * pageSize)
.limit(pageSize)
.collect(Collectors.toList());
- 對(duì)查詢(xún)結(jié)果進(jìn)行統(tǒng)計(jì):
long totalUserCount = userDao.getAllUsers().stream().count();
- 對(duì)查詢(xún)結(jié)果進(jìn)行求和:
int totalScores = userDao.getAllUsers()
.stream()
.mapToInt(User::getScore)
.sum();
- 對(duì)查詢(xún)結(jié)果進(jìn)行分組:
Map<Integer, List<User>> ageGroup = userDao.getAllUsers()
.stream()
.collect(Collectors.groupingBy(User::getAge));
- 對(duì)查詢(xún)結(jié)果進(jìn)行去重:
List<String> distinctNames = userDao.getAllUsers()
.stream()
.map(User::getName)
.distinct()
.collect(Collectors.toList());
數(shù)據(jù)進(jìn)行計(jì)算篩選
- 計(jì)算一個(gè)整數(shù)列表中所有偶數(shù)的和:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println("偶數(shù)之和:" + sum);
- 統(tǒng)計(jì)一個(gè)字符串列表中每個(gè)單詞出現(xiàn)的次數(shù):
List<String> words = Arrays.asList("apple", "banana", "orange", "apple", "banana", "apple");
Map<String, Long> wordCounts = words.stream()
.flatMap(word -> Arrays.stream(word.split("\\s+")))
.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
System.out.println("單詞出現(xiàn)次數(shù):" + wordCounts);
- 將一個(gè)整數(shù)列表按照指定的規(guī)則進(jìn)行分組:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Map<Integer, List<Integer>> groupedNumbers = numbers.stream()
.collect(Collectors.groupingBy(n -> (n - 1) % 3));
System.out.println("分組結(jié)果:" + groupedNumbers);
- 對(duì)一個(gè)用戶(hù)列表按照年齡進(jìn)行降序排序:
List<User> users = Arrays.asList(new User("Alice", 25), new User("Bob", 30), new User("Cathy", 20));
users.sort((u1, u2) -> u2.getAge() - u1.getAge());
System.out.println("按年齡降序排序的用戶(hù)列表:" + users);
- 對(duì)一個(gè)字符串列表進(jìn)行去重操作:
List<String> uniqueWords = Arrays.asList("apple", "banana", "orange", "apple", "banana").stream()
.distinct()
.collect(Collectors.toList());
System.out.println("去重后的字符串列表:" + uniqueWords);
- 對(duì)一個(gè)整數(shù)列表進(jìn)行前N個(gè)最大值的篩選:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int N = 3;
List<Integer> topNMaxValues = numbers.stream()
.limit(N)
.max(Comparator.naturalOrder())
.collect(Collectors.toList());
System.out.println("前N個(gè)最大值:" + topNMaxValues);
- 對(duì)一個(gè)整數(shù)列表進(jìn)行前N個(gè)最小值的篩選:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int N = 3;
List<Integer> topNMinValues = numbers.stream()
.limit(N)
.min(Comparator.naturalOrder())
.collect(Collectors.toList());
System.out.println("前N個(gè)最小值:" + topNMinValues);
- 對(duì)一個(gè)整數(shù)列表進(jìn)行前N個(gè)平均值的篩選:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int N = 3;
double sum = numbers.stream()
.limit(N)
.reduce(0L, (a, b) -> a + b); // 先計(jì)算總和再除以N得到平均值
List<Double> topNAverageValues = numbers.stream()
.limit(N)
.mapToDouble(Integer::intValue) // 將整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)進(jìn)行計(jì)算平均值
.sorted() // 按升序排序后取前N個(gè)平均值作為結(jié)果列表的元素
.collect(Collectors.toList());
System.out.println("前N個(gè)平均值:" + topNAverageValues);
方法融合
我可以給您一個(gè)示例,展示如何在Java Stream中融合使用不同的方法:
假設(shè)有一個(gè)User類(lèi),包含name(姓名)、age(年齡)和score(分?jǐn)?shù))屬性。我們使用Java Stream來(lái)對(duì)一組User對(duì)象進(jìn)行操作。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-540489.html
List<User> users = ... // 獲取User列表
// 示例1: 過(guò)濾、排序并限制結(jié)果數(shù)量
List<String> names = users.stream()
.filter(user -> user.getAge() >= 18) // 過(guò)濾年齡大于等于18歲的用戶(hù)
.sorted(Comparator.comparing(User::getScore).reversed()) // 按照分?jǐn)?shù)降序排序
.limit(5) // 限制結(jié)果數(shù)量為5個(gè)
.map(User::getName) // 提取姓名字段
.collect(Collectors.toList());
System.out.println(names); // 打印結(jié)果
// 示例2: 分組、求和、統(tǒng)計(jì)
Map<Integer, Long> ageCountMap = users.stream()
.collect(Collectors.groupingBy(User::getAge, Collectors.counting())); // 按照年齡分組并統(tǒng)計(jì)數(shù)量
int totalScore = users.stream()
.mapToInt(User::getScore) // 轉(zhuǎn)換成IntStream
.sum(); // 求和
System.out.println(ageCountMap);
System.out.println(totalScore);
// 示例3: 映射、去重
Set<String> uniqueNames = users.stream()
.map(User::getName) // 提取姓名字段
.distinct() // 去重
.collect(Collectors.toSet()); // 轉(zhuǎn)換為Set集合
System.out.println(uniqueNames);
// 示例4: 并行處理
int totalAge = users.parallelStream()
.mapToInt(User::getAge)
.sum();
System.out.println(totalAge);
以上示例展示了不同的Stream方法的融合應(yīng)用,如過(guò)濾(filter)、排序(sorted)、限制(limit)、映射(map)、分組(groupingBy)、求和(sum)、去重(distinct)等。您可以根據(jù)需求,在您的項(xiàng)目中融合使用這些方法來(lái)處理數(shù)據(jù)。如果有具體的問(wèn)題或需求,歡迎繼續(xù)向我提問(wèn)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-540489.html
到了這里,關(guān)于Java使用Stream API對(duì)于數(shù)據(jù)列表經(jīng)常處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!