我正在看保罗飞利浦的演讲:
http://www.youtube.com/watch?v=TS1lpKBMkgg
在12:48时,他在比较Scala和Java时说"在Java 8中他们的观点确实有效"
什么是Java"视图"以及Scala的等价物是什么?
更新:感谢Daniel的回答,我发现这篇文章很有帮助:http://www.scala-lang.org/docu/files/collections-api/collections_42.html
以下是我对Java 8 的Stream框架的理解:
虽然有人已经找到了一种方法来使用自定义线程池和Stream框架的并行执行,但我不能在Java 8 API中找到任何提及默认Java 8并行Stream实现将使用ForkJoinPool#commonPool()的内容.(Collection#parallelStream(),StreamSupport类中的方法,以及API中我不知道的其他可能的并行启用流源).
我只能搜索搜索结果的花絮是:
Lambda的状态:Libraries Edition("引擎盖下的并行")
Vaguely提到Stream框架和Fork/Join机制.
Fork/Join机器旨在实现此过程的自动化.
JEP 107:集合的批量数据操作
几乎直接表明Collection接口的默认方法#parallelStream()使用Fork/Join实现自身.但仍然没有关于公共池.
并行实现基于Java 7中引入的java.util.concurrency Fork/Join实现.
类数组(Javadoc)
直接表示使用公共池的多次.
ForkJoin公共池用于执行任何并行任务.
所以我的问题是:
在哪里说ForkJoinPool#commonPool()用于对从Java 8 API获得的流进行并行操作?
我看到大多数Java反编译器都支持Java 7.
有没有支持Java 8的反编译器 - 尤其是Lambda表达式?
我想在我的ubuntu机器上运行这样的反编译器.
以下是Java 7中的代码编译,但不是openjdk-1.8.0.45-31.b13.fc21.
static void f(Object o1, int i) {}
static void f(Object o1, Object o2) {}
static void test(boolean b) {
String s = "string";
double d = 1.0;
// The supremum of types 'String' and 'double' is 'Object'
Object o = b ? s : d;
Double boxedDouble = d;
int i = 1;
f(o, i); // fine
f(b ? s : boxedDouble, i); // fine
f(b ? s : d, i); // ERROR! Ambiguous
}
Run Code Online (Sandbox Code Playgroud)
编译器声称最后一个方法调用不明确.
如果我们改变的第二个参数的类型f …
我正在尝试使用-Dsun.java2d.dpiaware=false参数运行Java应用程序,但没有任何反应.
我希望有一个模糊的用户界面,但图标和字体的大小正常,似乎这个标志不起作用.
我在Windows 8.1上使用JDK 1.8.0_45.
我发现了这个错误https://bugs.openjdk.java.net/browse/JDK-8080153但我不明白如何解决它.
让我们ArrayList用一些简单的东西来填充它:
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(""+i);
}
Run Code Online (Sandbox Code Playgroud)
我将尝试使用不同的流API方法删除一个名为5的成员.为此我定义了方法,这将给我一个ConcurentModificationException使用迭代器的传统迭代.
void removeMember(String clientListener) {
list.remove(clientListener);
}
Run Code Online (Sandbox Code Playgroud)
这段代码给了我这个例外,我明白了:
list.parallelStream()
.filter(string -> string.equalsIgnoreCase("5"))
.forEach(string -> removeMember(string));
Run Code Online (Sandbox Code Playgroud)
但是,尝试只是stream(),不parallelStream()给出空指针异常(NPE),这对我来说很奇怪:
list.stream()
.filter(string -> string.equalsIgnoreCase("5"))
.forEach(string -> removeMember(string));
Run Code Online (Sandbox Code Playgroud)
现在将List类型更改为LinkedList<>.最后的代码stream()给了我一个ConcurentModificationException,parallelStream()突然工作!
所以,问题.
内部parallelStream()厨房(Spliterators和其他魔法)是否足够聪明,可以使用这种元素去除LinkedList?它会一直有效吗?
为什么NPE适合ArrayList?为什么选择NPE,不是ConcurentModificationException我的意思.
在过去十年左右的时间里,我一直在使用下面的模式来实现Java实用程序类.该类仅包含静态方法和字段,声明final为无法扩展,并且具有private构造函数,因此无法实例化.
public final class SomeUtilityClass {
public static final String SOME_CONSTANT = "Some constant";
private SomeUtilityClass() {}
public static Object someUtilityMethod(Object someParameter) {
/* ... */
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,随着Java 8 中接口中静态方法的引入,我最近发现自己使用了一个实用程序接口模式:
public interface SomeUtilityInterface {
String SOME_CONSTANT = "Some constant";
static Object someUtilityMethod(Object someParameter) {
/* ... */
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这使我摆脱构造,和大量的关键字(个public,static,final),这些接口中隐含的.
这种方法有什么缺点吗?在实用程序界面上使用实用程序类有什么好处吗?
我遇到了一个在运行Java 8时可以创建的一个相当奇怪的问题.问题表现在JVM本身内部发生了某种时序错误.它本质上是间歇性的,但很容易重现(至少在我的测试环境中).问题是显式设置的数组值在某些情况下被销毁并替换为0.0.具体来说,在下面的代码中,array[0]在行之后评估为0.0 new Double(r.nextDouble());.然后,如果您立即array[0]再次查看其内容,它现在会将该值显示为正确的值1.0.运行此测试用例的示例输出是:
claims array[0] != 1.0....array[0] = 1.0
claims array[0] now == 1.0...array[0] = 1.0`
Run Code Online (Sandbox Code Playgroud)
我正在运行64位Windows 7,并且能够从Eclipse中以及从命令行编译时使用JDK 1.8_45,1.8_51和1.8_60重现此问题.我无法解决运行1.7_51的问题.在另一个64位Windows 7机箱上演示了相同的结果.
这个问题出现在一个大型的,非平凡的软件中,但我已经设法将其浓缩为几行代码.下面是一个小问题,用于演示此问题.这是一个相当奇怪的测试用例,但似乎都有必要导致错误.使用Random不是必需的 - 我可以r.nextDouble()用任何双重值替换所有并证明问题.有趣的是,如果someArray[0] = .45;被替换someArray[0] = r.nextDouble();,我无法复制问题(虽然没有什么特别的.45).Eclipse调试也没有任何帮助 - 它会改变时间,使其不再发生.即使是陈述良好的System.err.println()声明也会导致问题不再出现.
同样,问题是间歇性的,因此要重现问题,可能需要多次运行此测试用例.我认为在获得上面显示的输出之前,我必须运行它的次数大约是10次.在Eclipse中,我在运行后给它一两秒,然后在没有发生时将其杀死.从命令行开始 - 运行它,如果它没有发生CTRL+C退出并再试一次.似乎如果它会发生,它会很快发生.
我在过去遇到过这样的问题,但它们都是线程问题.我无法弄清楚这里发生了什么 - 我甚至看过字节码(顺便说一下,1.7_51和1.8_45之间是相同的).
关于这里发生了什么的任何想法?
import java.util.Random;
public class Test {
Test(){
double array[] = new double[1];
Random r = new Random();
while(true){
double someArray[] = new double[1];
double …Run Code Online (Sandbox Code Playgroud) 我有以下案例:有一个对象列表 - ProductData包含几个字段:
public class ProductData
{
....
private String name;
private String xref;
//getters
//setters
}
Run Code Online (Sandbox Code Playgroud)
并且有API返回以下对象的列表:
public class RatingTableRow
{
private String planName;
private String planXref;
private int fromAge;
private int toAge;
private int ratingRegion;
//constructor
//getters
//setters
}
Run Code Online (Sandbox Code Playgroud)
但它返回具有空计划名称字段的对象,因为在提取此对象期间不允许这样做.我需要通过外部参照将产品数据与RatingTableRow链接,以便将计划名称设置为RatingTableRow,因为我需要稍后使用此对象,因此我创建了以下代码来执行此操作:
Map<String, ProductData> productByXref = plans.stream()
.collect(toMap(ProductData::getInternalCode, Function.identity()));
return getRatingTableRows(...).stream
.filter(ratingRow -> productByXref.containsKey(ratingRow.getPlanXref()))
.peek(row -> {
ProductData product = productByXref.get(row.getPlanXref());
row.setPlanName(product.getName());
})....;
Run Code Online (Sandbox Code Playgroud)
我知道java文档说这peek不符合这些需求,但希望得到关于如何以更正确的方式完成此任务的建议.
我刚刚遇到这个"bug",但我不确定这是不是意图:代码:
public static Object someMethod(){
assert SwingUtilities.isEventDispatchThread();
return new Object();
}
public static void main(String[] args){
SwingUtilities.invokeLater(() -> someMethod().toString());//First Example
SwingUtilities.invokeLater(someMethod()::toString);//Second Example
}
Run Code Online (Sandbox Code Playgroud)
在第一个例子中someMethod是在swing线程上执行,但在第二个例子中它不是,虽然它应该在我看来.
这是一个错误还是这个?
java ×10
java-8 ×10
java-stream ×2
class ×1
decompiler ×1
dpi-aware ×1
fork-join ×1
forkjoinpool ×1
interface ×1
jvm ×1
lambda ×1
memory ×1
overloading ×1
scala ×1
timing ×1