标签: java-8

在OpenShift的DIY盒式磁带上支持JDK 8

我知道WildFly盒式磁带没有JDK支持,但是我能以某种方式在实验性DIY盒式磁带上安装Java 8吗?java-1.7.0是/ usr/lib中的最新版本.

java-8 openshift

19
推荐指数
3
解决办法
1万
查看次数

Scala使用Java库,利用Java 8中的lambda表达式支持

根据:http: //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#lambda-expressions-in-gui-applications

先前:

btn.setOnAction(new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        System.out.println("Hello World!");
    }
});
Run Code Online (Sandbox Code Playgroud)

现在,我们可以:

btn.setOnAction(
  event -> System.out.println("Hello World!")
);
Run Code Online (Sandbox Code Playgroud)

现在,我在使用Java库时尝试在Scala中执行此操作.

我正在使用JavaFX(Java 1.8 SE中默认包含它).尝试:

chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
Run Code Online (Sandbox Code Playgroud)

但是,我得到:

Error:(204, 46) type mismatch;
 found   : javafx.scene.input.MouseEvent => Unit
 required: javafx.event.EventHandler[_ >: javafx.scene.input.MouseEvent]
    chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") )
                                             ^
Run Code Online (Sandbox Code Playgroud)

旧样式很好用:

chart.setOnMouseClicked( new EventHandler[MouseEvent] {
  override def handle(event: MouseEvent): Unit = println("NOT NOICE")
} )
Run Code Online (Sandbox Code Playgroud)

我在IntelliJ中将项目语言级别设置为Java 8,我使用的是Scala 2.11.1,以及来自Oracle 1.8.0_05的Java

我在这里错过了什么?或者是否根本无法将Scala中的lambda表达式传递给Java,就像在上述示例中所做的那样?

lambda scala javafx java-8 javafx-8

19
推荐指数
2
解决办法
6088
查看次数

JavaFX项目结构

使用FXML的JavaFX的MVC模型听起来很棒,但我很难找到如何组织我的项目包.

我发现的关于JavaFX的每一个教程都过于简单和无组织:他们只需创建一个包并在那里创建所有内容,每个控制器,每个fxml,每个css.我不想那样.我希望事情能在正确的位置.

尽管如此,JavaFX的"路径"似乎......"有限".使用URL使得如果我想将资源限制为本地文件,我必须完成所有工作getClass().getResource("foo.fxml").openStream().这很好,但是通过从类路径获取资源,路径来自类所在的包.我有点想要项目的根.这会简化我的生活,但JavaFX似乎并没有像这样工作.

让我们来看一个实际的例子:

想象一下,我有一个FXML"登录屏幕".想象一下,我希望登录屏幕使用样式表.理想情况下,该css将与该fxml位于同一个包中.但是,如果我想在另一个FXML中使用相同的.css呢?这是否意味着我必须将两个FXML放在同一个包中?显然我"不需要",但我该怎么做呢?

另外,假设我想在正确登录时更改场景.在FXML Controller适当的事件中,我将不得不调用"setScene".如果我在不同的包装中使用FXML,那么这条路也很难获得.似乎所有东西都在一个巨大的膨胀包中,或者一切都很难进入而不诉诸"../../dir"之类的黑客.

http://docs.oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm中的Henley Sales应用程序似乎是一个组织良好的应用程序的示例,尽管该应用程序是单个TabPane.不幸的是(至少我认为)来源不公开.它的想法是这样的:

client
  Main.class
  styles.css
      client.images
          image.png
      client.screen1
          Screen1.fxml
          Screen1Controller.java
      client.screen2
          Screen2.fxml
          Screen2Controller.java
      ...
Run Code Online (Sandbox Code Playgroud)

这似乎是一个糟糕的开始,但它有一些问题(或者至少我认为它们是问题).

对于'The Henley Sales',它很聪明,有一个Main可以调用其中一个包'FXML(易于访问,FXML的目录在Main类之下).不过,对于样式表,这必须是硬编码的scene.getStylesheets().add(...);.我真的更愿意选择在FXML中选择样式表.Afterall,stylesheet是View组件的一部分.从FXML中的URL访问.css文件对于这种结构来说会有点困难,因为它位于其目录之上.

此外,通过这个组织,我如何才能合理地改变场景?在这个项目中,这不是必需的,因为整个项目是一个TabbedPane.主叫它,它完成了.无需更多交换.但是一个简单的登录场景(或者为什么需要交换整个场景的原因)需要访问FXML路径.

然后是资源.Css文件可能需要使用图像.该结构通过将.css文件放在顶部,并为.css可能需要的文件创建一个包来解决它.如果我想要一个特定的FXML有一个不同的.css,那么,另一个问题就会到来.

这似乎是一个循环.Css需要访问共享资源文件夹.FXML需要访问Css.FXML的控制器需要访问其他FXML.我希望我清楚我的项目结构存在疑虑.请帮我创建一个JavaFX项目结构,该结构对于超过基本的应用程序来说足够强大,或者将我重定向到一些好的源代码.

哦,我顺便使用Netbeans.

css javafx organization java-8 fxml

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

超出范围时,ExecutorService是否会收集垃圾?

我问这个问题是因为我正在创建大量的执行程序服务,虽然我可能已经在需要调查的地方发生了内存泄漏,但我认为最近对以下代码的更改实际上使其恶化,因此我试图确认到底是怎么回事:

@FunctionalInterface
public interface BaseConsumer extends Consumer<Path> {
    @Override
    default void accept(final Path path) {
        String name = path.getFileName().toString();
        ExecutorService service = Executors.newSingleThreadExecutor(runnable -> {
            Thread thread = new Thread(runnable, "documentId=" + name);
            thread.setDaemon(true);
            return thread;
        });
        Future<?> future = service.submit(() -> {
            baseAccept(path);
            return null;
        });
        try {
            future.get();
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        } catch (ExecutionException ex) {
            throw new RuntimeException(ex);
        }
    }

    void baseAccept(final Path path) throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

然后Consumer<Path>在另一个具有(通常)N = 2个线程的线程池上调用它,我不确定这是否相关.

问题是:一旦完成,是否ExecutorService …

java multithreading garbage-collection executorservice java-8

19
推荐指数
2
解决办法
6438
查看次数

如何将字符串转换为Java 8字符流?

我发现这个问题是从java String中获取java.util.streams.IntStream但是我现在还没有找到这个方法,因为我使用的是Java 8.

更正:正如你们所指出的那样,我使用的是Java 7.现在方法chars()就在那里.但问题仍然适用:

如何Stream<Character>从字符串中获取?

java java-8 java-stream

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

Java 8双花括号初始化和名称冲突

以下类有一个名为的内部类Entry.此代码不会在Java 8中编译,因为编译器假定Entry双花括号初始值设定项中的引用是类型Map.Entry而不是Scope.Entry.这段代码在JDK的先前版本(至少6和7)中编译,但在JDK 8中被破坏.我的问题是"为什么?" Map.Entry未在此类中导入,因此编译器没有理由假设该值是类型Map.Entry.是否有一些隐含的范围被引入或匿名类的东西?

错误:

scope/Scope.java:23: error: incompatible types: scope.Scope.Entry cannot be converted to java.util.Map.Entry for (final Entry entry : entries) {
scope/Scope.java:22: error: cannot find symbol put(entry.getName(), entry);
Run Code Online (Sandbox Code Playgroud)

示例代码:

package scope;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class Scope {

    public static class Entry<T> {
        public String getName() {
            return "Scope";
        }
    }

    public static void main(String[] args) {
        final Set<Entry> entries = new HashSet<>();

        new HashMap<String, …
Run Code Online (Sandbox Code Playgroud)

java inner-classes shadowing java-8

19
推荐指数
1
解决办法
1601
查看次数

功能接口继承Quirk

我有一个我已经使用了一段时间的自定义界面,看起来像这样:

public interface Function<T, R> {
    R call(T input);
}
Run Code Online (Sandbox Code Playgroud)

我想用Java Function和Guava 来改进这个接口Function,同时保持它FunctionalInterface.我以为我有完美的安排:

@FunctionalInterface
public interface Function<T, R> extends
        java.util.function.Function<T, R>,
        com.google.common.base.Function<T, R> {

    R call(T input);

    @Override
    default R apply(T input) {
        return call(input);
    }
}
Run Code Online (Sandbox Code Playgroud)

两个超级apply()接口都声明了相同的方法,该方法已在我的界面中实现,只留下抽象call()方法.奇怪的是,它不会编译,告诉我

"@FunctionalInterface"注释无效; 函数<T,R>不是功能接口

更奇怪的是,以下变化编译得很好:

@FunctionalInterface
public interface Function<T, R> extends
        java.util.function.Function<T, R> {

    R call(T input);

    @Override
    default R apply(T input) {
        return call(input);
    }
}
Run Code Online (Sandbox Code Playgroud)

@FunctionalInterface
public interface Function<T, R> extends
        com.google.common.base.Function<T, R> …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 default-method functional-interface

19
推荐指数
1
解决办法
3084
查看次数

Java 8流字符串空或空过滤器

我在Stream里面有Google Guava:

this.map.entrySet().stream()
.filter(entity -> !Strings.isNullOrEmpty(entity.getValue()))
.map(obj -> String.format("%s=%s", obj.getKey(), obj.getValue()))
.collect(Collectors.joining(","))
Run Code Online (Sandbox Code Playgroud)

如您所见!String.isNullOrEmpty(entity),过滤器函数中有一个语句.

我不想再在项目中使用Guava了,所以我只想简单地将其替换为:

string == null || string.length() == 0;
Run Code Online (Sandbox Code Playgroud)

我怎么能更优雅呢?

java guava java-8 java-stream

19
推荐指数
4
解决办法
4万
查看次数

在java 8中使用lambda表达式有什么好处?

Interface AccountService{
    public void createAccount();
}

AccountService accountServiceAnonymous = new AccountService(){
    public void createAccount(){
        Account account = new Account();
        save(account);
    }
};

AccountService accountServiceLambda = () -> {
    Account account = new Account();
    save(account);
}
Run Code Online (Sandbox Code Playgroud)

除了减少代码行数之外,在java 8中使用lambda表达式还有什么其他优点吗?

java lambda java-8

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

为什么Files.list()并行流的执行速度比使用Collection.parallelStream()慢得多?

以下代码片段是获取目录列表的方法的一部分,在每个文件上调用extract方法并将生成的药物对象序列化为xml.

try(Stream<Path> paths = Files.list(infoDir)) {
    paths
        .parallel()
        .map(this::extract)
        .forEachOrdered(drug -> {
            try {
                marshaller.write(drug);
            } catch (JAXBException ex) {
                ex.printStackTrace();
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

这是完全相同的完全相同的代码,但使用普通.list()调用来获取目录列表并调用.parallelStream()结果列表.

Arrays.asList(infoDir.toFile().list())
    .parallelStream()
    .map(f -> infoDir.resolve(f))
    .map(this::extract)
    .forEachOrdered(drug -> {
        try {
            marshaller.write(drug);
        } catch (JAXBException ex) {
            ex.printStackTrace();
    }
});
Run Code Online (Sandbox Code Playgroud)

我的机器是四核MacBook Pro,Java v 1.8.0_60(内置1.8.0_60-b27).

我正在处理~7000个文件.平均3次运行:

第一版:有.parallel():20秒.没有.parallel():41秒

第二版:带.parallelStream():12秒.用.stream():41秒.

并行模式下的那8秒似乎是一个巨大的差异,因为extract从流中读取并完成所有繁重工作的方法和write执行最终写入的调用都没有改变.

java parallel-processing nio java-8 java-stream

19
推荐指数
2
解决办法
2284
查看次数