标签: java-8

Java 8 parallelstream将返回列表收集到一个列表而不是列表列表中

我想从并行流中将列表结果收集到一个列表中.让我们看看这段代码来更好地解释我的问题.这就是我得到的:

List<Object> a = new ArrayList<>();

List<List<Object>> result a.parallelStream() // I get a List of List
   .map(a -> { return new ArrayList(); })
   .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但我真正想拥有的更像是这样的:

List<Object> a = new ArrayList<>();

List<Object> result a.parallelStream()   // I want to add all list elements into one List of objects
   .map(a -> { return new ArrayList(); })
   .collect(Collectors.???); 
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

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

并行流上的skip()是否存在一个好的用例?


2015年9月编辑


当我最初问这个问题,2015年2月,在报道的行为所链接的问题是反直觉的,但那种规范允许(尽管在文档一些小的矛盾).

然而,Tagir Valeev在2015年6月问了一个新问题,我认为他清楚地证明了这个问题中报告的行为实际上是一个错误.Brain Goetz回答了他的问题,并承认,当一个终端操作触发时,不会阻止on 的特性的反向传播是一个错误,这个终端操作不会被迫尊重元素的遭遇顺序(例如) .此外,在他自己的回答的评论中,他分享了JDK的错误跟踪系统中发布的问题链接.UNORDEREDStreamskip()forEach()

该问题的状态现已解决,其修复版本为9,这意味着该修复程序将在JDK9中可用.但是,它也被反向移植到JDK8 update 60,build 22.

所以从JDK8u60-b22开始,这个问题再也没有意义了,因为现在skip()表现得像直觉一样,甚至在并行流上也是如此.


我原来的问题是......


最近我和一些同事讨论了这件事.我说skip()在并行流上使用它是没用的,因为它似乎没有一个很好的用例.他们告诉我有关性能提升,FJ池处理,jvm可用的核心数量等等,但他们无法给我任何实际的使用示例.

skip()并行流是否存在良好的用例?

在这里看到这个问题.请阅读问题和答案以及评论,因为那里有很多好的论据.

theory parallel-processing java-8 java-stream

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

无法通过Java 8上的反射调用HashMap的getEntry

我有一些遗留代码(使用JDK 7u55成功编译并运行),类似于以下内容:

private static class MyHashMap extends HashMap {
    static Method getEntryMethod;

    static {
        try {
            getEntryMethod = HashMap.class.getDeclaredMethod("getEntry", Object.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    MyHashMap myHashMap = new MyHashMap();
}
Run Code Online (Sandbox Code Playgroud)

尝试切换到JDK 8u31后,它失败了:

java.lang.NoSuchMethodException: java.util.HashMap.getEntry(java.lang.Object)
Run Code Online (Sandbox Code Playgroud)

java reflection java-8

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

在Java 8中重用Lambda表达式

Java 8允许您在不同的上下文中使用相同的lambda表达式。考虑下面的代码来演示这一点:

   public class LambdasTypeCheck {
        public static void main(String []args) {
            //Same lambda expression can be used in different contexts.
            Predicate<List<String>> predicate = (l) -> l.add("1");
            Consumer<List<String>>  consumer = (l) -> l.add("1");
        }
    }
Run Code Online (Sandbox Code Playgroud)

lambda表达式(l) -> l.add("1");在两个地方重复。如何避免这种重复?我可以重用此lambda表达式的一种方法是,是否有一些接口/类是所有lambda表达式的父级,这样我就可以将任何lambda表达式分配给此类接口/类的引用。

lambda reusability java-8

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

带自定义模式的JDK8 java.time.LocalTime

任何人都可以向我解释为什么这个测试通过:

import org.junit.Assert;
import org.junit.Test;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

import static org.hamcrest.core.Is.is;

public class BasicTest extends Assert{

    @Test
    public void testLocalTimeWithPredefinedPattern() throws Exception {
        DateTimeFormatter dtf = DateTimeFormatter.ISO_TIME;
        LocalTime time = LocalTime.parse("10:11:12", dtf);
        assertThat(time.toString(), is("10:11:12"));
    }

    /**
     * It's a kind of bug from my side of view
     */
    @Test(expected = DateTimeParseException.class)
    public void testLocalTimeWithCustomPattern() throws Exception {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("hh:mm:ss");
        LocalTime time = LocalTime.parse("10:11:12", dtf);
    }
}
Run Code Online (Sandbox Code Playgroud)

第二次测试捕获的异常如下所示:

java.time.format.DateTimeParseException: Text '10:11:12' could not be parsed: Unable …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-time

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

如何使用Java 8添加HashMap中包含的BigDecimals?

添加到Java 8中HashMap中包含的BigDecimal的最简单方法是什么?

java bigdecimal java-8

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

接受两种类型的Collection <T>和<T>的通用类型接口

以下Interface允许我这样做displayReuestResponse<String>:

public interface RequestResponse<T> 
{
    void displayRequestResponse(T output);
}
Run Code Online (Sandbox Code Playgroud)

另一方面,以下Interface允许我通过LinkedHashSet或者ArrayList:

public interface RequestResponse<T>
{
    void displayRequestResponse(Collection<T> output);
}
Run Code Online (Sandbox Code Playgroud)

我只是好奇,我们是否可以通过(调整)Interface可以接受这两种类型的方式使其更通用?或者这不可能吗?

java generics java-8

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

lambda用于接口实现时,“无效的lambda反序列化”

我有一个带有lambda表达式的检票口项目。在用户单击后退按钮的一页上,我的应用程序崩溃:

java.lang.IllegalArgumentException: Invalid lambda deserialization
at x.y.z.MyPage$3.$deserializeLambda$(MyPage.java:1)
Run Code Online (Sandbox Code Playgroud)

在页面类(我返回的地方)中,我使用lambda表达式实现此接口:

public interface Localizator extends Serializable {
    String getLocalizedString(String key);
}
Run Code Online (Sandbox Code Playgroud)

和lambda:

protected void someMethod() {
    localize((String key) -> getString(key));
}
Run Code Online (Sandbox Code Playgroud)

当我将lambda更改为匿名类时,一切正常。在这种情况下应如何使用lambda?

信封:Java 1.8.0_25,Netbeans 8.0.2,Wicket 6.17.0。

编辑:这是带有lambda的真实(但简化)方法:

@Override
protected DataLoader createDataLoader() {

    return new DataLoader(){

        @Override
        public List loadData() {
            ...
        }

        @Override
        public List convertToTableRows(List data) {
            return Converter.asRowList(
                data, 
                (Record record) -> {...}, // this lambda is OK
                (String key) -> getString(key)); // this lambda is crashing
        }

        @Override
        public List …
Run Code Online (Sandbox Code Playgroud)

lambda wicket java-8

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

如何将此代码片段转换为Java 8,其中逻辑依赖于索引值?

我有这个代码,我想在Java 8风格中看到它:

List<Double> outcome = ....
int step = data.size / 20;
for (int i = 0; i < 20; i++) {
  Instance inst = data.get(i * step).getInstance();
  if (inst.isPresent()) 
    outcome.add(100);
  else 
    outcome.add(0.0);
Run Code Online (Sandbox Code Playgroud)

对我来说,很容易将代码转换为Java 8流,但我不知道如何实现该data.get(i * step)部分.

java collections java-8

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

使用Java 8的新API的CollectionUtills进行编译错误

我想用一些包含数量的对象来迭代一个数组并获得totalQuantity,但是使用Java 8的新API代替每个循环的tipical.

这是我到目前为止的方式:

int totalQuantityOrdered=0;
    totalQuantityOrdered=CollectionUtils.isNotEmpty(details)?details.stream().forEach(detail->totalQuantityOrdered+=detail.getOrderHeader().getQuantity()):totalQuantityOrdered;
Run Code Online (Sandbox Code Playgroud)

但是我收到一个编译错误,告诉我为了使用lambda表达式,变量totalQuantityOrdered必须是final.然后我认为当变量是final时意味着它的值不能被修改,所以在这种情况下我如何实现我想要做的事情?

提前告诉你你的时间.

java lambda java-8

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