当前位置: 首页 > 知识库问答 >
问题:

Java SE8有对还是元组?

蓬威
2023-03-14

我正在Java SE 8中使用惰性函数操作,我想将索引I映射到一个对/元组(I,value[I]),然后根据第二个value[I]元素filter,最后只输出索引。

我还必须忍受这样的痛苦吗:Java中C++对 的等价物是什么?在兰姆达和溪流的大胆新时代?

更新:我给出了一个相当简化的例子,@dkatzel在下面的一个答案中提供了一个简洁的解决方案。但是,它并不是一概而论的。因此,让我补充一个更笼统的例子:

package com.example.test;

import java.util.ArrayList;
import java.util.stream.IntStream;

public class Main {

  public static void main(String[] args) {
    boolean [][] directed_acyclic_graph = new boolean[][]{
        {false,  true, false,  true, false,  true},
        {false, false, false,  true, false,  true},
        {false, false, false,  true, false,  true},
        {false, false, false, false, false,  true},
        {false, false, false, false, false,  true},
        {false, false, false, false, false, false}
    };

    System.out.println(
        IntStream.range(0, directed_acyclic_graph.length)
        .parallel()
        .mapToLong(i -> IntStream.range(0, directed_acyclic_graph[i].length)
            .filter(j -> directed_acyclic_graph[j][i])
            .count()
        )
        .filter(n -> n == 0)
        .collect(() -> new ArrayList<Long>(), (c, e) -> c.add(e), (c1, c2) -> c1.addAll(c2))
    );
  }

}

这会给出不正确的[0,0,0]输出,该输出对应于全部为false的三列的计数。我需要的是这三列的索引。正确的输出应该是[0,2,4]。我怎么才能得到这个结果呢?


共有1个答案

籍利
2023-03-14

更新:这个答案是针对原来的问题,Java SE8有对还是有元组?(如果没有,为什么没有?)OP用一个更完整的示例更新了这个问题,但似乎不需要使用任何类型的对结构就可以解决这个问题。[OP注:这里是另一个正确答案。]

简短的回答是否定的。您必须滚动您自己的或引入实现它的几个库中的一个。

在Java SE中使用pair类的建议至少被拒绝过一次。请参阅OpenJDK邮件列表中的讨论线程。权衡并不明显。一方面,在其他库和应用程序代码中有许多Pair实现。这说明了一种需要,并且向Java SE添加这样的类将增加重用和共享。另一方面,拥有Pair类会增加在不创建必要的类型和抽象的情况下从对和集合中创建复杂的数据结构的诱惑。(这是Kevin Bourillion在这条线上留言的转述。)

我建议大家阅读整篇邮件。它非常有洞察力,没有火焰。挺有说服力的。当它开始的时候,我想,“是的,在Java SE中应该有一个Pair类”,但是当线程结束的时候,我改变了主意。

从链接的问题中可以看出,Java中C++对的等价物是什么?在表面上如此简单的API周围有相当大的设计空间。对象应该是不可变的吗?它们应该是可序列化的吗?它们应该有可比性吗?这堂课到底要不要终审?这两个元素是否应该排序?它应该是一个接口还是一个类?为什么要停在对上?为什么不是三元组、四元组或n元组?

当然,元素的命名是不可避免的:

  • (a,b)
  • (第一、第二)
  • (左、右)
  • (car,cdr)
  • (foo,bar)
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair

当然,这让人想起Java SE 8中Java.util.function包中函数接口的激增。如果你不想要一个臃肿的API,你会省略哪些呢?您还可以认为这还不够,还应该添加boolean的专门化。

我的感觉是,如果Java早就添加了一个Pair类,它会很简单,甚至是简单化的,它不会满足我们现在设想的许多用例。考虑一下,如果在JDK1.0的时间框架中添加了Pair,那么它可能是可变的!(查看java.util.date。)人们会对此感到高兴吗?我的猜测是,如果Java中有一个Pair类,那么它就会有点不太有用,每个人仍然会滚动自己的类来满足自己的需求,外部库中将会有各种Pair和Tuple实现,人们仍然会争论/讨论如何修复Java的Pair类。换句话说,就像我们今天所处的地方一样。

同时,一些工作正在进行以解决基本问题,即在JVM(最终是Java语言)中更好地支持值类型。请参阅值文档的此状态。这是初步的、推测性的工作,它只涉及JVM角度的问题,但它已经有了相当多的思考。当然,不能保证这会进入Java9或者任何地方,但它确实表明了当前对这个主题的思考方向。

 类似资料:
  • 本文向大家介绍css中padding和margin是相对于父元素还是子元素呢?相关面试题,主要包含被问及css中padding和margin是相对于父元素还是子元素呢?时的应答技巧和注意事项,需要的朋友参考一下 当padding和margin被设置为百分比的时候,这个百分比是相对于它们的包含块元素的宽度 至于什么是包含块请看这里

  • 问题内容: 这就是我通常做,以确定输入是一个/ -但不是。因为很多时候我偶然发现了一个错误,即一个函数错误地传递了一个对象,而目标函数确实假设这实际上是一个or 。 我的问题是:是否有更好的方法来实现这一目标? 问题答案: 仅在python 2中(不是python 3): 实际上就是您想要的,否则您会错过很多像列表一样的东西,但它们不是or的子类。

  • 问题内容: 我一直在将Groovy on Rails用于CRUD应用程序。我正在开始一个新项目,在该项目中,我们不再允许使用Grails(我们没有允许的jar和grails列表)。 我正在考虑使用Spring ROO或JBoss Seam。他们如何比较?他们的主要优点和缺点是什么? 问题答案: 请注意,Spring Roo和JBoss Seam不能直接比较,因为JBoss Seam本身不提供问题中

  • 问题内容: 在互联网上有关使用Java进行Soap开发的教程之后,我找到了此链接,其中包含一个非常不寻常的代码。 代码: ‘extends Object’语法是什么?我从未遇到过这种语法(仅适用于泛型)。 这个语法有什么用吗?还是“傻瓜”? 问题答案: 除非Object类实际上不是该类(本教程不包括导入,所以很难看到),否则它是多余的。

  • 问题内容: 在标记内嵌套或任何其他块级元素在语法和语义上是否正确。我说的是HTML4过渡DTD。 如果不是,可以改为使用吗? 问题答案: 在语法上,一个里面是HTML的所有标准无效。此外,当使用符合标准的HTML解析器时,由于开头标签会自动关闭元素,因此无法将元素放置在DOM中的a 内。 从语义上来说,正确的选择取决于您要标记的内容。您将需要至少显示一个示例完整的段落以及可能包含其周围的内容,以确

  • 本文向大家介绍sitecore 确保值是对还是错,包括了sitecore 确保值是对还是错的使用技巧和注意事项,需要的朋友参考一下 示例 要断言值是true还是false,请执行以下操作: 您还可以为异常消息传递格式化参数