标签: java-stream

在多线程情况下使用限制流的最佳方式性能

我观看了JoséPaumard在InfoQ上的演讲:http: //www.infoq.com/fr/presentations/jdk8-lambdas-streams-collectors(法语)

问题是我被困在这一点上.要使用流和多线程收集1M Long ,我们可以这样做:

Stream<Long> stream = 
  Stream.generate(() -> ThreadLocalRandom.current().nextLong()) ;

List<Long> list1 = 
  stream.parallel().limit(10_000_000).collect(Collectors.toList()) ;
Run Code Online (Sandbox Code Playgroud)

但考虑到线程总是在检查上述限制以阻碍性能.

在那次演讲中我们也看到了第二个解决方案:

Stream<Long> stream = 
  ThreadLocalRandom.current().longs(10_000_000).mapToObj(Long::new) ;

List<Long> list = 
  stream.parallel().collect(Collectors.toList()) ;
Run Code Online (Sandbox Code Playgroud)

它似乎是更好的表现.

所以这是我的问题:为什么第二个代码更好,是否有更好的,或者至少成本更低的方法呢?

java random multithreading java-8 java-stream

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

使用Optional Java 8避免在List处理中进行"空检查"

在Class中Site,我有两种实用方法.

第一个,如果没有错误发生parseStub,则解析Site为a ; 否则,它返回.使用:Master nullOptional

public static Optional<Master> parseStub(Site site) {
    // do some parse work; return Optional.empty() if the parse fails.
}
Run Code Online (Sandbox Code Playgroud)

第二种方法parseStubs是解析的列表Site到的列表Master.它重用parseStub,并且必须处理可能为空的Optional<Master>:

public static List<Master> parseStubs(List<Site> sites) {
    return sites.stream()
            .<Master>map(site -> Site.parseStub(site).orElse(null))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的代码中,我null再次介绍.
我怎么能避免null(和filter(Objects::nonNull))使用Optional一致?

functional-programming nullable optional java-8 java-stream

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

将嵌套for循环重构为Java 8流

我有以下for循环:

    List<Map> mapList = new ArrayList<>();
    for (Resource resource : getResources()) {
        for (Method method : resource.getMethods()) {
            mapList.add(getMap(resource,method));
        }
    }
    return mapList;
Run Code Online (Sandbox Code Playgroud)

我怎么能将这个嵌套循环重构为Java 8流?

java java-8 java-stream

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

使用Java 8 Stream打印修改后的列表值

拥有如下清单

List<Integer> values = new ArrayList<Integer>();

values.add(1);
values.add(0);
values.add(1);
values.add(1);
values.add(0);
Run Code Online (Sandbox Code Playgroud)

我想打印> 0添加元素的元素,例如10,使用Java 8 Stream。例如:

values.stream()
    .filter(val -> val > 0)
    // HERE add 10
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

有可能这样做吗?如果是,怎么办?

java lambda java-stream

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

如何使用Stream拆分集合中的奇数和偶数以及两者的总和

我如何使用java-8的Stream方法拆分奇数和偶数并在集合中求和?

public class SplitAndSumOddEven {

public static void main(String[] args) {

    // Read the input
    try (Scanner scanner = new Scanner(System.in)) {
        // Read the number of inputs needs to read.
        int length = scanner.nextInt();
        // Fillup the list of inputs
        List<Integer> inputList = new ArrayList<>();
        for (int i = 0; i < length; i++) {
            inputList.add(scanner.nextInt());
        }
        // TODO:: operate on inputs and produce output as output map
        Map<Boolean, Integer> oddAndEvenSums = inputList.stream(); \\here I want to split odd …
Run Code Online (Sandbox Code Playgroud)

java collections lambda java-8 java-stream

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

从String构建List <T>

我正在尝试创建一个泛型函数,该函数基于一个字符串构建任何类型的List,该字符串包含以let表示逗号分隔的那种类型的值.我这样做了:

public static <T> List<T> stringToList(String listStr, Class<T> itemType)
{
    return Arrays.asList(listStr.split(",")).stream().map(x -> itemType.cast(x.replaceAll("\\s+|\"|\t","")))).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

当我尝试用它测试时:

String listStringsStr  = "\"Foo\", \"Bar\"";
List<String> resS = stringToList(listStringsStr, String.class);

String listIntegersStr = "1,10,-1,0";
List<Integer> resI = stringToList(listStringsStr, Integer.class);
Run Code Online (Sandbox Code Playgroud)

我有两个问题.

  1. 在第一种情况下(String),我在每个字符串项周围得到一个额外的双引号:""Foo"",""Bar"".
  2. 在第二种情况下(整数)我得到一个java.lang.ClassCastException: Cannot cast java.lang.String to java.lang.Integer意味着它不能将"1"转换为1.我知道这适用Integer::parseInt,但我想制作一个通用方法.

有任何想法吗?

[编辑] - 因为我发布它的方式引起了混乱,我添加了测试代码:

String listStringsStr  = "\"Foo\", \"Bar\"";
List<String> listStrings = Arrays.asList("Foo", "Bar");
String listIntegersStr = "1,10,-1,0";
List<Integer> listIntegers = Arrays.asList(1, 10, -1, 0);

List<String> resS = stringToList(listStringsStr, String.class);
System.out.println(resS);
System.out.println(listStrings);
assert …
Run Code Online (Sandbox Code Playgroud)

java casting java-stream

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

如何使用流对列表进行排序?

我想整理一个简单的清单.示例Integers:

List<Integer> numbers = Arrays.asList(4, 2, 7, 1, 4);
numbers.stream().sorted((n1, n2) -> {
    System.out.println("comparing: " + n1 + " with " + n2);
    return Integer.compare(n1, n2);
});
Run Code Online (Sandbox Code Playgroud)

结果:没有打印出来!没有应用排序.因此,甚至不执行排序方法.为什么?

旁注:我的目的是直接修改列表(在一个对象中),因此我试图阻止创建一个新列表.

java java-8 java-stream

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

在多个线程之间共享流实例是否安全?

我有一套钥匙.

class X {
  private static String[] keys = {"k1", "k2", ... };
Run Code Online (Sandbox Code Playgroud)

我必须从请求中提取键的值.我想我可以map用来提取值并在一些请求处理方法中创建列表必需的对象,如下所示:

  public void processReq(Request req) {
    ...
    Stream.of(keys).map(k-> new Pack(k, req.getHeader(k)));
Run Code Online (Sandbox Code Playgroud)

但是Stream根据每个请求创建看起来不必要的任 如果Stream在多个线程之间共享实例是安全的,我想我可以像这样修改代码:

class X {
  private static Stream<String> keys = Stream.of("k1", "k2", ...);
  ...

  public void processReq(Request req) {
    ...
    keys..map(k-> new Pack(k, req.getHeader(k)));
Run Code Online (Sandbox Code Playgroud)

那么,Stream在多个线程之间共享实例是否安全?

java multithreading java-8 java-stream

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

流已经被操作或关闭 - Java 8

为什么我有下一个例外?

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)...
Run Code Online (Sandbox Code Playgroud)

com.search.offer.OffersSelector.isGood(OffersSelector.java:23)如何更改代码来修复它?

Stream<String> titleExclusions = ResourceUtility.contentToUtf8TreeSet("+.txt").
        stream().filter(item -> item.length() == 0).collect(Collectors.toSet()).stream();
//...
titleExclusions.filter(tittle::contains).collect(Collectors.toSet()).size() == 0;//line 23
Run Code Online (Sandbox Code Playgroud)

java exception filter java-8 java-stream

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

将嵌套的循环转换为流

我在理解流时遇到了一些麻烦.我环顾四周,似乎无法找到与我的用例匹配的示例.

我有一个现有的嵌套for循环:

List<ObjectB> objectBs = new ArrayList<ObjectB>();
for (ObjectA objA: objectAList) {
    for (ObjectB objB: objA.getObjectBList()) {
        if (objB.getNumber() != 2) {
            objectBs.add(objB);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

很多示例显示如何添加objB.getNumber()到列表但不是objB.

java java-8 java-stream

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