2016-11-16 7 views
-1

Java 8(Object :: Method)のメソッドリファレンスを使用しています。前にやったことをやっているが、忘れてしまったこと(私がこのメソッドリファレンスを使った最後の時間は約4か月前だった)は、Method Referenceを使って!= onlineというプレーヤーの量を見いだすことです。あなたが見ることができるように メソッドリファレンスとブール

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()); 

は、私はプレイヤー(友人が)オンラインですが、ときにそれは私がされているかのフィルタとオフラインの選手を収集する方法を見つけ出すことができないように管理しました。私は明白な何かを見逃していますが、それは何ですか?!?!

ありがとう、 デューク。

+3

スコープ演算子ではなく、メソッド参照と呼ばれます。 – Eran

+0

@Eran、ああああ。一度に2つのことを考え、誤って間違ったことを言わせて、私のところでお詫び申し上げます!それに私を迎えてくれてありがとう。 –

答えて

0

は、私は考えることができる2つの方法があります。

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()); 
+0

または 'friends.stream()。filter((述語)Friend :: isOnline).negate())。collect(Collectors.toSet());' – Eran

+0

パーフェクト、歓声@Whatzs –

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

あなたは、ZMFriends.getFriends(playerUUID)によって返される配列にListビューを作成するには、ちょうどそれにstream()を呼び出すために、HashSetにその内容をコピーします。

ソースタイプは後続のストリーム操作とは無関係なので、これはリソースの無駄です。 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を両方とも取得するために同じ操作を2回実行しなければならないため、アプリケーションが実際に両方とも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に関連付けられているオフラインの友人を提供します。

関連する問題