一,去重
首先,假设你有一个用户类User
,其中包含手机号属性phoneNumber
:
javapublic class User {
private String name;
private String phoneNumber;
// 构造器、getter和setter省略
}
然后,你可以使用Stream
API和Collectors.toMap
方法来根据手机号去重:
javaimport java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<WebUser> users = null;// 假设这是你的用户信息列表
Map<String, WebUser> uniqueUsersMap = users.stream()
.collect(Collectors.toMap(
WebUser::getPhone, // key映射函数,这里使用手机号作为key
user -> user, // value映射函数,这里直接使用User对象
(existing, replacement) -> existing // 合并函数,如果有重复的key,保留现有的
));
List<WebUser> uniqueUsers = uniqueUsersMap.values().stream().collect(Collectors.toList());
// 现在uniqueUsers包含了去重后的用户信息列表
}
}
在这段代码中,Collectors.toMap
方法接受三个参数:
- Key映射函数:这里使用
User::getPhoneNumber
作为key,即每个用户的手机号。 - Value映射函数:这里直接使用
user -> user
,即每个用户的整个对象。 - 合并函数:当有重复的key时,需要决定如何处理。在这里,我们使用
(existing, replacement) -> existing
,意味着如果有重复的手机号,保留第一个遇到的用户信息。
二,peek 方法
peek
方法用于在流的每个元素上执行一个操作,但是并不改变流中的元素。这个方法主要用于调试目的,因为它允许你查看流中的元素。peek
方法不会改变流的状态,它仅仅在每个元素上执行一个操作。
peek
方法的签名如下:
javaStream<T> peek(Consumer<? super T> action)
T
是流中元素的类型。Consumer<? super T>
是一个函数接口,它接受一个T
类型的参数,并执行一个操作。
一个使用peek
方法的例子:
javaList<String> words = Arrays.asList("a", "b", "c");
words.stream()
.peek(System.out::println) // 打印每个元素
.filter(s -> s.length() > 1)
.forEach(System.out::println); // 只打印长度大于1的元素
在这个例子中,peek
方法用于打印流中的每个元素,然后filter
方法用于过滤出长度大于1的元素,最后forEach
方法用于打印这些过滤后的元素。
三,map 方法
map
方法用于将流中的每个元素映射到另一个元素上,它可以改变流中元素的类型。map
方法接受一个函数作为参数,这个函数会被应用到流中的每个元素上,并将结果收集到一个新的流中。
map
方法的签名如下:
java<R> Stream<R> map(Function<? super T, ? extends R> mapper)
T
是流中元素的类型。R
是映射后流中元素的类型。Function<? super T, ? extends R>
是一个函数接口,它接受一个T
类型的参数,并返回一个R
类型的结果。
一个使用map
方法的例子:
javaList<String> words = Arrays.asList("1", "2", "3");
List<Integer> numbers = words.stream()
.map(Integer::parseInt) // 将每个字符串转换为整数
.collect(Collectors.toList());
在这个例子中,map
方法用于将字符串列表中的每个元素转换为整数,然后收集到一个新的列表中。
Comments NOTHING