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)
我也有同样的问题。这是我想出来的,但由于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)
| 归档时间: |
|
| 查看次数: |
1778 次 |
| 最近记录: |