标签: java-8

Eclipse Kepler Java 8

我想开始在Eclipse中使用Java 8,但我不知道如何安装它 - 我找不到任何关于它的教程.我正在使用Eclipse Kepler并为IDE添加了JDK 8的JRE,但由于JRE版本的合规性问题,它不会让我继续创建项目.如何在Eclipse Kepler IDE中使用Java 8?

eclipse java-8

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

是否可以使用Java 8 Streams API进行异步处理?

我一直在Java 8中使用CompletionStage/CompletableFuture来进行异步处理,这非常有效.但是,有时我想要一个阶段来执行迭代器/项目流的异步处理,似乎没有办法做到这一点.

具体来说,Stream.forEach()具有语句,在调用之后所有项都已处理完毕.我想要同样的东西,但改为使用CompletionStage,例如:

CompletionStage<Void> done = stream.forEach(...);
done.thenRun(...);
Run Code Online (Sandbox Code Playgroud)

如果Stream由异步流式传输结果支持,那么比等待它在上面的代码本身中完成要好得多.

是否有可能以某种方式使用当前的Java 8 API构建它?解决方法?

java asynchronous java-8 java-stream

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

Java 8 CompletableFuture中的默认值超时

假设我有一些异步计算,例如:

CompletableFuture
        .supplyAsync(() -> createFoo())
        .thenAccept(foo -> doStuffWithFoo(foo));
Run Code Online (Sandbox Code Playgroud)

如果异步供应商根据某些指定的超时超时,是否有一种很好的方法为foo提供默认值?理想情况下,此类功能也会尝试取消运行缓慢的供应商.例如,是否存在类似于以下假设代码的标准库功能:

CompletableFuture
        .supplyAsync(() -> createFoo())
        .acceptEither(
                CompletableFuture.completedAfter(50, TimeUnit.MILLISECONDS, DEFAULT_FOO),
                foo -> doStuffWithFoo(foo));
Run Code Online (Sandbox Code Playgroud)

或者甚至更好:

CompletableFuture
        .supplyAsync(() -> createFoo())
        .withDefault(DEFAULT_FOO, 50, TimeUnit.MILLISECONDS)
        .thenAccept(foo -> doStuffWithFoo(foo));
Run Code Online (Sandbox Code Playgroud)

我知道get(timeout, unit),但我想知道是否有一种更好的标准方式,以异步和反应方式应用超时,如上面的代码所示.

编辑:这是一个受Java 8启发的解决方案:在lambda表达式中强制检查异常处理.为什么强制,不是可选的?,但不幸的是它阻止了一个线程.如果我们依赖createFoo()来异步检查超时并抛出自己的超时异常,它可以在不阻塞线程的情况下工作,但会给供应商的创建者带来更多负担,并且仍然会产生创建异常的成本(可以没有"快速投掷"而昂贵

static <T> Supplier<T> wrapped(Callable<T> callable) {
    return () -> {
        try {
            return callable.call();
        } catch (RuntimeException e1) {
            throw e1;
        } catch (Throwable e2) {
            throw new RuntimeException(e2);
        }
    };
}
CompletableFuture
        .supplyAsync(wrapped(() -> CompletableFuture.supplyAsync(() -> createFoo()).get(50, …
Run Code Online (Sandbox Code Playgroud)

java java-8

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

Lambdas,多个forEach与铸造

需要一些帮助思考来自我的同伴StackOverflow名人的lambda.

选择列表列表以在图表中深入收集一些孩子的标准情况.什么样的方法可以Lambdas帮助这个样板?

public List<ContextInfo> list() {
    final List<ContextInfo> list = new ArrayList<ContextInfo>();
    final StandardServer server = getServer();

    for (final Service service : server.findServices()) {
        if (service.getContainer() instanceof Engine) {
            final Engine engine = (Engine) service.getContainer();
            for (final Container possibleHost : engine.findChildren()) {
                if (possibleHost instanceof Host) {
                    final Host host = (Host) possibleHost;
                    for (final Container possibleContext : host.findChildren()) {
                        if (possibleContext instanceof Context) {
                            final Context context = (Context) possibleContext;
                            // copy to another object -- not …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

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

Java 8 Streams:为什么Collectors.toMap对于带有通配符的泛型有不同的行为?

假设你有一个List数字.在该值List可以是类型的Integer,Double等等.当你声明这样的List有可能使用一个通配符(声明它?)或不用一个通配符.

final List<Number> numberList = Arrays.asList(1, 2, 3D);
final List<? extends Number> wildcardList = Arrays.asList(1, 2, 3D);
Run Code Online (Sandbox Code Playgroud)

所以,现在我想streamListcollect它所有的Map使用Collectors.toMap(显然下面的代码只是为了说明问题的例子).让我们开始流式传输numberList:

final List<Number> numberList = Arrays.asList(1, 2, 3D, 4D);

numberList.stream().collect(Collectors.toMap(
        // Here I can invoke "number.intValue()" - the object ("number") is treated as a Number
        number -> Integer.valueOf(number.intValue()),
        number -> number));
Run Code Online (Sandbox Code Playgroud)

但是,我不能对以下内容做同样的操作wildcardList:

final List<? extends Number> wildCardList …
Run Code Online (Sandbox Code Playgroud)

java generics lambda java-8 collectors

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

我如何否定lambda谓词?

假设我有一串字符串.

final Stream<String> stream = ...;
Run Code Online (Sandbox Code Playgroud)

我想在修剪后过滤掉每个空字符串.

stream
    .filter(Objects::nonNull)
    .map(String::trim)
    .filter(v -> !v.isEmpty());
Run Code Online (Sandbox Code Playgroud)

有没有办法应用Predicate#negate()替换v -> !v.isEmpty()部分?

.filter(((Predicate) String::isEmpty).negate()) // not compile
Run Code Online (Sandbox Code Playgroud)

java lambda predicate java-8

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

Stream.collect方法中的组合器如何在java 8中工作?

我创建了简单的演示:

public static void main(String[] args) {
        List<String> list2 = Arrays.asList("adf", "bcd", "abc", "hgr", "jyt", "edr", "biu");

String collect = list2.stream().collect(String::new, (res, elem) -> {
              res=res.concat(" ").concat(elem);
//            System.out.printf("res=%s, elem=%s\n", res.isEmpty(), elem);

        }, (res1, res2) -> {
            System.out.printf("res1=%s, res2=%s\n", res1, res2);            
        });
        System.out.println("collect=" + collect);
}
Run Code Online (Sandbox Code Playgroud)

问题是BiConsumer combiner部分collect根本没有运行.

如果我使用parallelStream()两个参数res1并且res2等于供应商,它就会运行String::new.

如何combinercollect方法中工作?

java java-8 java-stream

27
推荐指数
3
解决办法
6385
查看次数

在地图中加入List <String>

我正在尝试将a转换Map<String, List<String>>为a Map<String, String>,其中每个键的值是通过连接List上一个映射中的所有值而构建的联合字符串,例如:

A -> ["foo", "bar", "baz"]
B -> ["one", "two", "three"]
Run Code Online (Sandbox Code Playgroud)

应转换为

A -> "foo|bar|baz"
B -> "one|two|three"
Run Code Online (Sandbox Code Playgroud)

使用Java 8 Streams API执行此操作的惯用方法是什么?

java java-8 java-stream

27
推荐指数
3
解决办法
1430
查看次数

注册流"完成"钩子

使用Java 8 StreamAPI,我想注册一个"完成钩子",类似于:

Stream<String> stream = Stream.of("a", "b", "c");

// additional filters / mappings that I don't control
stream.onComplete((Completion c) -> {
    // This is what I'd like to do:
    closeResources();

    // This might also be useful:
    Optional<Throwable> exception = c.exception();
    exception.ifPresent(e -> throw new ExceptionWrapper(e));
});
Run Code Online (Sandbox Code Playgroud)

我为什么要那么做的原因是因为我想包装在一个资源Stream的API客户端,消费,我想的是Stream,一旦它被消耗自动清理资源.如果可能,那么客户可以致电:

Collected collectedInOneGo =
Utility.something()
       .niceLookingSQLDSL()
       .moreDSLFeatures()
       .stream()
       .filter(a -> true)
       .map(c -> c)
       .collect(collector);
Run Code Online (Sandbox Code Playgroud)

而不是目前所需要的:

try (Stream<X> meh = Utility.something()
                            .niceLookingSQLDSL()
                            .moreDSLFeatures()
                            .stream()) {

    Collected collectedWithUglySyntacticDissonance = …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

27
推荐指数
3
解决办法
1967
查看次数

Java 8 Update 71正在尝试安装新的帮助工具.(在Mac上)

我刚刚被提示更新Java.它告诉我:

在此输入图像描述

有人知道那个"助手"工具是做什么的吗?如果它是新的我可能不需要它.有没有办法选择退出?或者至少在安装之前知道它是什么?

请注意,我已经在"系统偏好设置"下的"Java控制面板"中选中了禁止赞助商优惠的选项.

在此输入图像描述

另请注意,如果我未输入管理员密码,则不会安装更新.除了更新之外,它不是提供的,我可以接受或拒绝.

如果这是一个不好的问题或错误的地方,请评论.


这是一个后续行动.

我再次收到消息,并搜索了有关它的更多信息.我了解到更新过程已经包含在应用程序中.应用程序包装实际包,并提出其他软件.如果您选择退出,我猜它只是安装了Java更新.

"新助手工具"可能就是这个安装包装器,或者如果您不选择退出,可能还会提供其他软件.

如果您更喜欢安装干净的软件包,可以从安装程序中提取它.下载更新后,单击取消.然后转到~/Library/Application Support/Java(~/Library隐藏,所以使用Go> Go to folder ...).您可以看到所有过去的Java更新下载.选择最新版本.在文件夹中,您会看到一个应用程序和一个dmg.右键单击应用程序并选择Show Package Contents.在应用程序里面去Contents/Resources.你找到一个包裹JavaAppletPlugin.pkg.那是实际的包裹.双击它进行安装.它仍会询问您的姓名和密码,但这次是由OSX/macOS询问并用于安装该软件包而不是其他任何内容.


最新更新:今天更新失败.发生这种情况时,立即删除下载.在这种情况下,上述方法不起作用.


这开始看起来像博客.失败的下载是由于我的杀毒软件.当我禁用它时,它再次起作用.无论如何,我现在相信这个信息是无害的.操作系统X询问我是否同意运行Java安装程序.它不会尝试安装任何其他东西.我跑了.

java install auto-update java-8

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