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