为什么没有添加list.map()
(编辑:或list.transform()
或list.mumble()
)(这是一个历史问题),在默认运行时库中是否有一个使用其他方法的简单速记,它做了我没有注意到的相同的事情?
当然,我不能深入了解Java设计人员的头脑,但我可以想到许多不在集合上包含map
(或其他流方法)的原因。
>
这是API膨胀。同样的事情也可以用更一般的方法来完成,只需使用流进行较小的键入开销。
它会导致代码膨胀。如果我在列表上调用map
,我希望结果与我调用它的列表具有相同的运行时类型(或至少具有运行时属性)。因此,对于ArrayList.map
将返回ArrayList
、LinkedList.map
LinkedList
等,这意味着在所有List
实现中都需要实现相同的功能(在接口中使用合适的默认实现,这样旧代码就不会被破坏)。
它鼓励使用list.map(function1).map(function2)
这样的代码,这比list.stream().map(function1).map(function2).collect(collectors.tolist())
效率低得多,因为前者构造了一个立即被丢弃的辅助列表,而后者将两个函数应用于列表元素,然后才构造结果列表。
对于像Scala这样的函数式语言,优点和缺点之间的平衡可能是不同的。
我不知道Java标准库中有什么快捷方式,但您当然可以实现自己的快捷方式:
public static <S,T> List<T> mapList(List<S> list, Function<S,T> function) {
return list.stream().map(function).collect(Collectors.toList());
}
Java中的本质上是不可靠的。具体地说,我对接口的最大问题是,它需要一个不定义方法本身的方法行为。因此,如果遍历一个列表,您必须使用反射来访问它定义的行为。然而,在Java8中,我们现在有了默认方法,现在我问为什么在中没有默认的方法。 我理解为什么接口不能默认对象方法,但是,这是一个明确的设计决定,所以可以做出例外。 我有点想弃用并将其内部代码更改为类似以下内容: 然后继续使用使作为中的默认方法的
问题内容: Java固有地被破坏了。具体来说,我与接口有关的最大问题是,它期望方法行为无法定义方法本身。因此,如果遍历列表,则必须使用反射来访问其定义的行为。但是,在Java 8中,我们现在有了默认方法,现在我问为什么在中没有默认方法。 我知道为什么接口不能使用默认的Object方法,但是,这是一个明确的设计决定,因此可以进行例外处理。 我有点设想过时,并将其内部代码更改为以下内容: 并且继续进行
问题内容: 我当时正在编写一个简短的脚本来更改元素的内部文本,但是发现它没有方法。我知道那不是继承自,但似乎不是一种有用的方法吗?是否有一个具体的实施问题,我不知道阻止添加的到? 注意:我知道Dojo和jQuery 的节点列表都有某种形式。由于限制,我无法使用任何一个。 问题答案: 现在,NodeList在所有主要浏览器中都具有forEach() 原始答案 这些答案都不能解释 为什么 NodeLi
如果我有一个struct Foo和一个struct Bar: 如果我初始化一个条并打印正确得到的值: 但是现在如果我声明这样的构造函数: 我失去了Bar::foo的默认构造,程序输出了32764 0 5! 为什么我不得不像这样无声地初始化每个成员变量: 只要我声明一个构造函数?在这种情况下,为什么默认构造不起作用?
在的末尾,我们将 将声明为的默认导出。 然后当我们将这个文件导入到中时,我们简单地将 也以这种方式导入。 但是,中没有包含导出默认寄存器ServiceWorker语句。 我有两个问题- 这是如何工作,而没有一个语句中的? 而且还 为什么registerServiceWorker从一开始就没有大写?如本SO答案所述,它是内置组件吗? 以下是,供参考:
脚本内容如下,没有写Shebang行 执行 ./xxx.sh,得到输出结果 y 执行 bash ./xxx.sh,得到输出结果 y 执行 zsh ./xxx.sh,得到输出结果 x zsh数组下标是从1开始的,所以zsh的结果应该是输出y。 MacOS默认的Shell是zsh,但是执行./xxx.sh结果却不是y