所以我一直在使用Java 8(Object :: Method)中的方法引用。我试图做的,我以前做过但已经忘记了(上次我使用这个方法参考大约是4个月前),找到玩家的数量!=在线使用方法参考。
public static Set<Friend> getOnlineFriends(UUID playerUUID)
{
Set<Friend> friends = new HashSet<>(Arrays.asList(ZMFriends.getFriends(playerUUID)));
return friends.stream().filter(Friend::isOnline).collect(Collectors.toSet());
}
public static Set<Friend> getOfflineFriends(UUID playerUUID)
{
Set<Friend> friends = new HashSet<>(Arrays.asList(ZMFriends.getFriends(playerUUID)));
return friends.stream().filter(Friend::isOnline).collect(Collectors.toSet());
正如你所看到的那样,当玩家(朋友)在线但我无法弄清楚如何通过Set过滤并收集离线玩家时我设法了。我错过了一些明显的东西,但它是什么?!?!
谢谢, 杜克。
答案 0 :(得分:2)
在你的代码中
public static Set<Friend> getOnlineFriends(UUID playerUUID)
{
Set<Friend> friends = new HashSet<>(Arrays.asList(ZMFriends.getFriends(playerUUID)));
return friends.stream().filter(Friend::isOnline).collect(Collectors.toSet());
}
您正在为List
返回的数组创建ZMFriends.getFriends(playerUUID)
视图,将其内容复制到HashSet
,只需在其上调用stream()
。
这是浪费资源,因为源类型与后续流操作无关。您无需拥有Set
来源即可获得Set
结果。因此,您可以简单地将操作实现为
public static Set<Friend> getOnlineFriends(UUID playerUUID)
{
return Arrays.stream(ZMFriends.getFriends(playerUUID))
.filter(Friend::isOnline).collect(Collectors.toSet());
}
此外,您应该考虑在实际实施中是否真的需要getOnlineFriends
和getOfflineFriends
。提前创建实用程序方法,仅仅因为可能需要它们,很少会得到回报。另请参阅“You aren’t gonna need it”。
但如果你真的需要这两个操作,它仍然是一个不必要的代码重复。请考虑一下:
public static Set<Friend> getFriends(UUID playerUUID, boolean online)
{
return Arrays.stream(ZMFriends.getFriends(playerUUID))
.filter(f -> f.isOnline()==online).collect(Collectors.toSet());
}
解决这两项任务。如果应用程序确实需要两个Set
,它仍然会浪费资源,因为应用程序仍然需要执行两次相同的操作才能获得Set
个。考虑:
public static Map<Boolean,Set<Friend>> getOnlineFriends(UUID playerUUID)
{
return Arrays.stream(ZMFriends.getFriends(playerUUID))
.collect(Collectors.partitioningBy(Friend::isOnline, Collectors.toSet()));
}
这为您提供了两个 Set
,与true
相关联的在线朋友,与false
关联的离线朋友。
答案 1 :(得分:0)
我有两种方法可以想到:
friends.stream().filter(i -> !i.isOnline()).collect(Collectors.toSet());
但我猜这不是你想要的,因为它没有使用method reference
。也许是这样的:
public static <T> Predicate<T> negation(Predicate<T> predicate) {
return predicate.negate();
}
...
friends.stream().filter(negation(Friend::isOnline)).collect(Collectors.toSet());