C LINQ select方法到Java
我一直在努力翻译这个C LINQ select方法到Java,java,c#,linq,Java,C#,Linq,我一直在努力翻译这个 var winner = node.Connections.Where(n => n.HQ != null).GroupBy(n =>n.HQ) .Select(g => new { Cantidate = g.Key, Count =
var winner =
node.Connections.Where(n => n.HQ != null).GroupBy(n
=>n.HQ)
.Select(g => new { Cantidate = g.Key, Count =
g.Count() })
.OrderByDescending(g => g.Count)
.First()
.Cantidate;
对于Java,尽管我不确定是否可以通过流实现这一点。我希望有人能准确地向我解释这些代码的作用,或者帮助我将其翻译成Java。
我一直在寻找这一资源:
但我仍然无法理解这些代码行的作用
我理解前3行,但选择让我迷路了
提前谢谢
编辑:
在尝试了“帮助”中的一些代码后,我得到了以下结果:
Map<Candidate,List<Candidate>> winnersByWinner = node.getConnections().stream()
.map(Node::getHQ)
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(Function.identity()));
winner = winnersByWinner.entrySet().stream()
.map(e -> new AbstractMap.SimpleImmutableEntry<>(e.getKey(), e.getValue().size()))
.sorted(new Comparator<AbstractMap.SimpleImmutableEntry<Candidate, Integer>>() {
@Override
public int compare(AbstractMap.SimpleImmutableEntry<Candidate, Integer> o1, AbstractMap.SimpleImmutableEntry<Candidate, Integer> o2) {
Integer o1v = o1.getValue();
Integer o2v = o2.getValue();
if(o1v==o2v) {
Integer o1k = o1.getKey().getId();
Integer o2k = o2.getKey().getId();
return o2k.compareTo(o1k);
}
return o1v.compareTo(o2v);
}
})
//.reversed())
//.sorted(Comparator.comparingInt(AbstractMap.SimpleImmutableEntry::getValue).reversed())
.map(Map.Entry::getKey)
.findFirst()
.orElseGet(null);
翻译为:
candidates.stream().map(c -> nodes.stream().map(Node::getHQ).filter(c::equals).count())
再次感谢诺瓦塔塔
我的代码现在运行得很好,但我必须进行编辑,以确保最后一件我可能翻译得不好的事情:
nodes.Where(n => n.Committes.Any()
翻译成:
nodes.stream().filter(n -> !n.Committes.isEmpty()).collect(Collectors.toList())
这是否正确?以下是代码的说明
var winner =node.Connections.Where(n => n.HQ != null) // this is checking the connection where HQ is not null
.GroupBy(n=>n.HQ) // grouping based on HQ
.Select(g => new { Cantidate = g.Key, Count = g.Count() }) // creating an enumerable anonymous type with cantidate , count
.OrderByDescending(g => g.Count) // sorting this enumerable type in type order based on the count
.First() // take the first element from this enumerable type
.Cantidate; // get the value of cantidate of that first element
这将是等效的SQL
(from n in connection
where( n.HQ != null)
GroupBy(n.HQ) into g
select new { Cantidate = g.key, Count = g.Count()}
orderby Count descending).First().Cantidate
使用您提供的链接将其转换为java 这是假设节点是具有getHQ属性的类型节点。这是我对你需要做的事情的近似值。使用SimpleImmutableEntry替换匿名类型。为了可读性,我将创建一个简单的私有类来替换它。要点是groupBy将生成一个映射,您需要使用.entrySet.stream Map.Entry将其转换回流。该条目与C中的KeyValuePair非常相似。希望其余内容是不言自明的。我在这里使用的任何方法或类,您都应该查找它
Map<HQ,List<HQ>> winnersByWinner = node.getConnection().stream()
.map(Node::getHQ)
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(Function.identity()))
HQ winner = winndersByWinnder.entrySet().stream()
.map(e -> new AbstractMap.SimpleImmutableEntry<>(e.getKey(), e.getValue().size()))
.sorted(Comparator.comparingInt(Map.Entry::getValue).reversed())
.map(Map.Entry::getKey)
.findFirst()
.orElseGet(null);
Select未创建字典。它正在创建匿名类型的可枚举性。谢谢,但我仍然不知道如何在Java中实现这一点链接与Java流无关。您需要用一个简单的私有内部类替换匿名对象,并使用相同的FieldsTry映射。Entry::getValue InsteadAlway,不要使用==表示相等,除非它是一个基元或您正在查找完全相同的对象。使用。否则等于。我不认为HQ是原始的,是吗?或者您正在寻找确切的对象吗?candidates.Selectc=>nodes.Countn=>n.HQ==c;应该是candidates.stream.mapc->nodes.stream.mapNode::getHQ.filterc::equals.count非常感谢您,但实际上这并不太有效。我一直在尝试将它与收藏家分组。分组方式。。。之后,映射不起作用,无法解析映射,并且SimpleImmutableEntry无法解析方法getKey和getValue存在问题。最后,但并非最不重要的一点是,我在尝试转换时遇到了一个错误:无法从静态上下文引用非静态方法。Map和Map完全不相关。Map与C中的IDictionary相同,Map与Select相同。groupBy返回一个映射,因此必须执行entrySet.stream才能继续。如果有帮助,请将其另存为映射变量。你确定你在使用JDK 8吗?@KompiKompi my bad,我忘了用collect包装groupBy。我习惯于使用joo lambda,这使得流更像Linq。你可能会喜欢它,但我认为你应该先学习纯溪流@你能用你试过的java代码更新你的问题吗?包括尽可能多的关于类型的信息。我还在想办法解决其他问题,但我一直在犯这个错误
Map<HQ,List<HQ>> winnersByWinner = node.getConnection().stream()
.map(Node::getHQ)
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(Function.identity()))
HQ winner = winndersByWinnder.entrySet().stream()
.map(e -> new AbstractMap.SimpleImmutableEntry<>(e.getKey(), e.getValue().size()))
.sorted(Comparator.comparingInt(Map.Entry::getValue).reversed())
.map(Map.Entry::getKey)
.findFirst()
.orElseGet(null);