方法引用和布尔值

时间:2016-11-16 10:17:09

标签: java java-8

所以我一直在使用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过滤并收集离线玩家时我设法了。我错过了一些明显的东西,但它是什么?!?!

谢谢, 杜克。

2 个答案:

答案 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());
}

此外,您应该考虑在实际实施中是否真的需要getOnlineFriendsgetOfflineFriends。提前创建实用程序方法,仅仅因为可能需要它们,很少会得到回报。另请参阅“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());
相关问题