标签: java-8

什么是Java 8"视图"?

我正在看保罗飞利浦的演讲:

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 scala java-8

24
推荐指数
1
解决办法
1867
查看次数

官方文档在哪里说Java的并行流操作使用fork/join?

以下是我对Java 8 的Stream框架的理解:

  1. 东西产生了源
  2. 该实现负责提供BaseStream#parallel()方法,该方法依次返回可以并行运行其操作的Stream.

虽然有人已经找到了一种方法来使用自定义线程池和Stream框架的并行执行,但我不能在Java 8 API中找到任何提及默认Java 8并行Stream实现将使用ForkJoinPool#commonPool()的内容.(Collection#parallelStream(),StreamSupport类中的方法,以及API中我不知道的其他可能的并行启用流源).

我只能搜索搜索结果的花絮是:


所以我的问题是:

在哪里说ForkJoinPool#commonPool()用于对从Java 8 API获得的流进行并行操作?

java fork-join java-8 forkjoinpool java-stream

24
推荐指数
2
解决办法
6295
查看次数

反编译器支持Java 8?

我看到大多数Java反编译器都支持Java 7.

有没有支持Java 8的反编译器 - 尤其是Lambda表达式?

我想在我的ubuntu机器上运行这样的反编译器.

java decompiler java-8

24
推荐指数
1
解决办法
2万
查看次数

方法使用Java 8三元条件和未装箱的原语过载歧义

以下是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 …

java overloading java-8

24
推荐指数
1
解决办法
1169
查看次数

Java禁用dpi-aware无法正常工作

我正在尝试使用-Dsun.java2d.dpiaware=false参数运行Java应用程序,但没有任何反应.

我希望有一个模糊的用户界面,但图标和字体的大小正常,似乎这个标志不起作用.

我在Windows 8.1上使用JDK 1.8.0_45.

我发现了这个错误https://bugs.openjdk.java.net/browse/JDK-8080153但我不明白如何解决它.

java jvm-arguments java-8 dpi-aware

24
推荐指数
2
解决办法
2万
查看次数

Java 8流API:修改列表时的例外情况

让我们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()突然工作!

所以,问题.

  1. 内部parallelStream()厨房(Spliterators和其他魔法)是否足够聪明,可以使用这种元素去除LinkedList?它会一直有效吗?

  2. 为什么NPE适合ArrayList?为什么选择NPE,不是ConcurentModificationException我的意思.

java java-8 java-stream

24
推荐指数
3
解决办法
9968
查看次数

接口是Java 8中实用程序类的有效替代吗?

在过去十年左右的时间里,我一直在使用下面的模式来实现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 interface class utility-method java-8

24
推荐指数
2
解决办法
5903
查看次数

Java 8奇数时序/内存问题

我遇到了一个在运行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)

java memory jvm timing java-8

24
推荐指数
1
解决办法
963
查看次数

Java 8偷看vs地图

我有以下案例:有一个对象列表 - 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不符合这些需求,但希望得到关于如何以更正确的方式完成此任务的建议.

java java-8

24
推荐指数
1
解决办法
2万
查看次数

为什么invokeLater在主线程中执行?

我刚刚遇到这个"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 lambda multithreading java-8 method-reference

24
推荐指数
2
解决办法
2397
查看次数