Java 8 Lambdas - 相当于c#OfType

Pet*_*pov 13 c# java lambda java-8

我现在正在学习新的Java 8功能,经过4年专门在C#世界,所以lambdas对我来说是最重要的.我现在正在努力寻找C#的"OfType"方法的等价物.

我所拥有的是List myNodes,我想从中获取一个List,其中Node是一个接口,而SpecificNode正在实现它.

在C#中它会是

IList<INode> myNodes = new List<INodes>(){new SpecificNode(), new OtherNode()}
IList<SpecificNode> specificNodes = myNodes.OfType<SpecificNode>()
Run Code Online (Sandbox Code Playgroud)

Kon*_*kov 16

有没有确切的在Java中的比赛.OfType<T>()方法,但是你可以使用Java8的过滤功能:

IList<INode> myNodes = new ArrayList<INode>();
myNodes.add(new SpecificNode());
myNodes.add(new OtherNode());

List<SpecificNode> filteredList = myNodes.stream()
                                         .filter(x -> x instanceof SpecificNode)
                                         .map(n -> (SpecificNode) n)
                                         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果你想得到明确的演员表,你可以这样做:

List<SpecificNode> filteredList = myNodes.stream()
                                             .filter(SpecificNode.class::isInstance)
                                             .map(SpecificNode.class::cast)
                                             .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 你只需要在过滤器和收集器之间使用`.map(n - >(SpecificNode)n)`. (2认同)

And*_*ker 5

我也有同样的问题。这是我想出来的,但由于java不做扩展方法(也许再过10年?),它是一个静态方法。这是使用流 API,尽管没有特殊原因您必须这样做。for相同的基本检查在使用预先分配的 ArrayList 的循环中可以很好地工作。

@SuppressWarnings("unchecked")
private static <T> List<T> ofType(Class<?> out, List<Object> list) {
    return list.stream().filter(x -> out.isAssignableFrom(x.getClass()))
               .map(x -> (T) x) // unchecked
               .collect(Collectors.toList());
}

// fyi this code uses "boon" library
List<Object> objlist = list("ABC", 3, "def", -30.39); 
puts("strings=", ofType(String.class, objlist));  // strings= [ABC, def] 
puts("integers=", ofType(Integer.class, objlist)); // integers= [3]
Run Code Online (Sandbox Code Playgroud)

这是不使用流的版本。它的工作原理是一样的,但流的一些乐趣在于……你也许能够流式传输它们,如果那是你的喜好的话。除了这样的帮助者之外,我发现它并不经常有用。

private static <T> List<T> ofType(Class<?> out, List<Object> list) {
    List<T> outList = new ArrayList<T>(list.size());
    for(Object o : list) {
        if ( out.isAssignableFrom(o.getClass())) {
            outList.add((T)o);
        }
    }
    return outList;
}
Run Code Online (Sandbox Code Playgroud)