当前位置: 首页 > 面试题库 >

Java SE 8是否具有对或元组?

淳于昊然
2023-03-14
问题内容

我正在使用Java SE 8中的惰性html" target="_blank">函数操作,我想要一个对对/元组map的索引,然后基于第二个元素,最后只输出索引。i``(i, value[i])``filter``value[i]

我是否还必须忍受这一点:Java中的C++Pair等效项是什么?在lambda和stream的大胆新时代中?

更新: 我提供了一个相当简化的示例,该示例在以下答案之一中提供了@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]该输出对应于all的三列的 计数false。我需要的是这三列的 索引
。正确的输出应为[0, 2, 4]。我怎么能得到这个结果?


问题答案:

更新: 此答案是对原始问题的回答, Java SE 8是否具有对或元组?
(如果不是,则隐式地,为什么不这样做?)OP用一个更完整的示例更新了该问题,但似乎无需使用任何一种Pair结构即可解决该问题。OP的注:这是[另一个正确答案。

似乎完整的示例可以在不使用任何种类的Pair结构的情况下解决。关键是过滤列索引,用谓词检查整个列,而不是将列索引映射到该列中的false条目数。

执行此操作的代码在这里:

    System.out.println(
        IntStream.range(0, acyclic_graph.length)
            .filter(i -> IntStream.range(0, acyclic_graph.length)
                                  .noneMatch(j -> acyclic_graph[j][i]))
            .boxed()
            .collect(toList()));

这导致输出[0, 2, 4]这是我觉得在OP请求正确的结果。

还请注意将值boxed()装箱intInteger对象中的操作。这使人们能够使用预先存在的toList()收集器,而不必写出自己进行装箱的收集器功能。

最简洁的答案是不。您要么自己动手,要么引入实现它的几个库之一。

Pair建议在Java
SE中创建一个类,并至少拒绝一次。请参阅OpenJDK邮件列表之一上的讨论线程。权衡并不明显。一方面,其他库和应用程序代码中有许多Pair实现。这就表明有必要,将这样的类添加到Java
SE中将增加重用和共享。另一方面,拥有Pair类增加了在Pairs和collections中创建复杂的数据结构而不创建必要的类型和抽象的诱惑。(这是凯文·布洛里恩(Kevin
Bourillion)从该帖子发出的信息的解释。

我建议大家阅读整个电子邮件主题。它非常有见地,没有发炎。这很有说服力。刚开始的时候我以为“是的,Java
SE中应该有一个Pair类”,但是到线程结束时,我改变了主意。

但是请注意,JavaFX具有javafx.util.Pair类。JavaFX的API与Jav​​a
SE API分开发展。

从链接的问题中可以看出,Java中的C
++对相当于什么?很显然,围绕如此简单的API的设计空间很大。对象应该是不可变的吗?它们应该可序列化吗?它们应该具有可比性吗?上课应该是最后的吗?这两个元素应该排序吗?应该是接口还是类?为什么要结伴而行?为什么不使用三元组,四元组或N元组?

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

  • (a,b)
  • (第一秒)
  • (左右)
  • (汽车,cdr)
  • (foo,bar)
  • 等等

几乎没有提到的一个大问题是成对与基元的关系。如果您有一个(int x, int y)表示2D空间中一个点的基准,则将该基准表示为Pair<Integer, Integer>消耗 三个对象
而不是两个32位字。此外,这些对象必须驻留在堆上,并且会产生GC开销。

显然,像Streams一样,对于Pairs而言,必须具有原始的专业化知识。我们是否想看看:

Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair

即使IntIntPair仍然需要堆上有一个对象。

当然,这些使人想起java.util.functionJava SE
8软件包中功能接口的泛滥。如果您不希望使用膨胀的API,那么您会忽略哪些?您还可以说这还不够,因此还Boolean应该添加专门的领域。

我的感觉是,如果Java很久以前添加了Pair类,那将是简单的,甚至是简单的,并且它不会满足我们现在设想的许多用例。考虑一下,如果在JDK
1.0的时间范围内添加了Pair,那么它可能是可变的!(查看java.util.Date。)人们对此会感到满意吗?我的猜测是,如果Java中有一个Pair类,那将有点用处而不是真正有用,并且每个人仍然会自己滚动以满足他们的需求,外部库中将有各种Pair和Tuple实现,而且人们仍然会争论/讨论如何修复Java的Pair类。换句话说,有点像我们今天所处的位置。

同时,正在进行一些工作来解决基本问题,即在JVM(最终是Java语言)中为 值类型提供
更好的支持。请参阅此价值状态文档。这是初步的,推测性的工作,仅涵盖了JVM角度的问题,但背后已经有很多思考。当然,我们不能保证它会进入Java
9,也不会进入任何地方,但确实显示了有关此主题的最新思路。



 类似资料:
  • 问题内容: 有没有办法断言某个元素(例如输入或链接)具有键盘焦点?我在Selenium中使用Codeception。在http://codeception.com/docs/modules/WebDriver上找不到任何内容 问题答案: 一个可靠的消息来源告诉我这可行: 测试愉快!

  • 问题内容: 这似乎是一个愚蠢的问题,但是我在基本页面上添加了UL,并且列表似乎偏离了中心。列表没有什么特别的。没有添加特定的CSS:只是一个列表。当我加载直播时,它稍微偏离中心。 左侧是否有默认边距或填充? 主体具有用于居中,对齐,浮动等的所有css代码。“标题标题”完美对齐。只是列表有点小。 谢谢。 哦,不知道这是否重要,但是我添加了“ id”原因…想要使用“ first-of-type”来赋予

  • 问题内容: 这似乎是一个愚蠢的问题,但是我在基本页面上添加了UL,列表似乎偏离了中心。列表没有什么特别的。没有添加特定的CSS:只是一个列表。当我加载直播时,它稍微偏离中心。 左侧是否有默认边距或填充? 主体具有用于居中,对齐,浮动等的所有css代码。“标题标题”完美对齐。只是列表有点小。 谢谢。 哦,不知道这是否重要,但是我添加了“ id”原因…想要使用“ first-of-type”来赋予第一

  • 问题内容: 我在文件中有一系列Python类。一些类引用其他类。 我的代码是这样的: 尝试运行它,我得到了。足够公平,但是有什么方法可以使它起作用,还是我必须手动重新排列我的课程才能容纳?在C ++中,我可以创建一个类原型。Python是否具有等效功能? (我实际上是在玩Django模型,但是我没有尝试使事情复杂化)。 问题答案: 在Python中,您本身并不会创建原型,但是您需要了解“类属性”和

  • 问题内容: 我正在使用jQuery,以查看是否有一种简单的方法来确定该元素是否具有与之关联的特定CSS类。 我有该元素的ID,以及我要寻找的CSS类。我只需要能够在if语句中根据元素上该类的存在进行比较。 问题答案: 使用方法: 要么 该参数(显然)是一个字符串,代表您要检查的类,并且返回一个布尔值(因此它不像大多数jQuery方法一样支持链接)。 注意: 如果传递包含空格的参数,则它将与集合的元

  • 问题内容: Go是否支持lambda表达式或类似内容? 我想从使用lambda表达式(Ruby)的另一种语言移植库。 问题答案: 这是一个示例,请仔细复制并粘贴: