标签: java-stream

Java 8,整数流,整数流对流的索引进行分组?

我得到了一个Integers流,我想按每个元素的值对元素的索引进行分组.
例如,{1, 1, 1, 2, 3, 3, 4}将整数分组为索引列表映射:

1 -> 0, 1, 2
2 -> 3
3 -> 4, 5
4 -> 6
Run Code Online (Sandbox Code Playgroud)

我尝试过使用stream,但还有一个额外的类:

@Test
public void testGrouping() throws Exception {
    // actually it is being read from a disk file
    Stream<Integer> nums = Stream.of(1, 1, 1, 2, 3, 3, 4);  
    // list to map by index
    int[] ind = {0};  // capture array, effectively final
    class Pair {
        int left;
        int right;

        public Pair(int left, int right) …
Run Code Online (Sandbox Code Playgroud)

java dictionary java-8 java-stream

9
推荐指数
2
解决办法
4422
查看次数

(非静态)内部类的构造方法引用?

StaticClass::new给定外部类实例的内部类是否有相同的东西?

编辑:

即如果我有

class Outer {
    class Inner {
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以Outer o = new Outer(); Inner i = o.new Inner()用旧Java 做.如何表达o.new Inner()as函数引用.

java lambda java-8 java-stream

9
推荐指数
2
解决办法
1462
查看次数

如何从Set <Integer>创建IntStream?

我目前这样做:

Set<Integer> integers = ... // sourced from elsewhere in code
IntStream intStream = integers.stream().mapToInt(value -> value);
Run Code Online (Sandbox Code Playgroud)

将值映射到值,将转换为Stream<Integer>to 似乎是多余的IntStream.有没有办法在没有冗余mapToInt(...)部分的情况下做到这一点?

java java-8 java-stream

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

带有调用者工作窃取的自定义池的Java parallelStream()?

通常当使用Java 8的parallelStream()时,结果是通过默认的公共fork-join池(即ForkJoinPool.commonPool())执行.

然而,如果一个人的工作远离CPU限制,例如可能在很多时候都在等待IO,那么这显然是不可取的.在这种情况下,人们会想要使用一个单独的池,根据其他标准确定大小(例如,任务可能实际使用CPU的时间有多少).

有没有明显得到parallelStream()使用不同池的方式,但作为一个详细的方式在这里.

不幸的是,这种方法需要从fork-join池线程调用并行流上的终端操作.这样做的缺点是,如果目标分支连接池完全忙于现有工作,整个执行将等待它,而什么都不做.因此,池可能成为比单线程执行更糟糕的瓶颈.相反,当以"正常"方式使用parallelStream()时,使用ForkJoinPool.common.externalHelpComplete()或ForkJoinPool.common.tryExternalUnpush()来让池外的调用线程帮助处理.

有谁知道的方式既获得parallelStream()使用非默认的fork-join池,并有从的fork-join池帮助外的调用线程在这项工作中的处理(但fork-不休息加入游泳池的工作)?

java fork-join java-8 forkjoinpool java-stream

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

Stream.collect(groupingBy(identity(),counting())然后按值对结果进行排序

我可以将一个单词列表收集到一个包中(也称为多组):

Map<String, Long> bag =
        Arrays.asList("one o'clock two o'clock three o'clock rock".split(" "))
        .stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

但是,包的条目不保证按任何特定顺序排列.例如,

{rock=1, o'clock=3, one=1, three=1, two=1}
Run Code Online (Sandbox Code Playgroud)

我可以将它们放入列表中,然后使用我的值比较器实现对它们进行排序:

ArrayList<Entry<String, Long>> list = new ArrayList<>(bag.entrySet());
Comparator<Entry<String, Long>> valueComparator = new Comparator<Entry<String, Long>>() {

    @Override
    public int compare(Entry<String, Long> e1, Entry<String, Long> e2) {
        return e2.getValue().compareTo(e1.getValue());
    }
};
Collections.sort(list, valueComparator);
Run Code Online (Sandbox Code Playgroud)

这给出了期望的结果:

[o'clock=3, rock=1, one=1, three=1, two=1]
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方式来做到这一点?我敢肯定这是很多人必须解决的问题.我可以使用Java Streams API内置的东西吗?

java java-8 java-stream

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

Java 8流连接并返回多个值

我正在将一段代码从.NET移植到Java,并偶然发现了我想使用流来映射和缩减的场景.

class Content
{
  private String propA, propB, propC;
  Content(String a, String b, String c)
  {
    propA = a; propB = b; propC = c;
  }
  public String getA() { return propA; }
  public String getB() { return propB; }
  public String getC() { return propC; }
}

List<Content> contentList = new ArrayList();
contentList.add(new Content("A1", "B1", "C1"));
contentList.add(new Content("A2", "B2", "C2"));
contentList.add(new Content("A3", "B3", "C3"));
Run Code Online (Sandbox Code Playgroud)

我想编写一个函数,可以流式传输contentlist的内容并返回一个带有结果的类

content { propA = "A1, A2, A3", propB = "B1, B2, B3", propC = …
Run Code Online (Sandbox Code Playgroud)

java dictionary collect java-8 java-stream

9
推荐指数
3
解决办法
5592
查看次数

Java Streams - 标准偏差

我想提前澄清我正在寻找一种使用Streams计算标准偏差的方法(我目前有一种计算和返回SD但不使用Streams的工作方法).

我正在使用的数据集与Link中的匹配密切相关.如此链接所示,我能够对数据进行分组并获得平均值但无法弄清楚如何获得SD.

码

outPut.stream()
            .collect(Collectors.groupingBy(e -> e.getCar(),
                    Collectors.averagingDouble(e -> (e.getHigh() - e.getLow()))))
            .forEach((car,avgHLDifference) -> System.out.println(car+ "\t" + avgHLDifference));
Run Code Online (Sandbox Code Playgroud)

我还检查了DoubleSummaryStatistics上的Link,但它似乎对SD没有帮助.

java standard-deviation java-8 java-stream

9
推荐指数
2
解决办法
5302
查看次数

即时向Java 8并行Streams添加元素

目标是在Java 8流的帮助下处理连续的元素流.因此,在处理该流时,将元素添加到并行流的数据源中.

Streams的Javadoc在"无干扰"部分中描述了以下属性:

对于大多数数据源,防止干扰意味着确保在流管道的执行期间根本不修改数据源.值得注意的例外是其源是并发集合的流,这些集合专门用于处理并发修改.并发流源是Spliterator报告CONCURRENT特性的源.

这就是在我们的尝试中使用ConcurrentLinkedQueue的原因,它返回true

new ConcurrentLinkedQueue<Integer>().spliterator().hasCharacteristics(Spliterator.CONCURRENT)
Run Code Online (Sandbox Code Playgroud)

没有明确说明,在并行流中使用时不得修改数据源.

在我们的示例中,对于流中的每个元素,递增的计数器值被添加到队列中,该队列是流的数据源,直到计数器大于N.通过调用queue.stream(),一切正常,顺序执行:

import static org.junit.Assert.assertEquals;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;

public class StreamTest {
    public static void main(String[] args) {
        final int N = 10000;
        assertEquals(N, testSequential(N));
    }

    public static int testSequential(int N) {
        final AtomicInteger counter = new AtomicInteger(0);
        final AtomicInteger check = new AtomicInteger(0);
        final Queue<Integer> queue = new ConcurrentLinkedQueue<Integer>();

        for (int i = 0; i < N / 10; ++i) {
            queue.add(counter.incrementAndGet());
        }

        Stream<Integer> …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing concurrency multithreading java-stream

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

结合子串的流

我有以下的代码,遍历对Java DateTimeFormatter的图形组合"E".."EEEE"和"M".."MMMM".

我的问题是,在这种情况下,是否存在使用Java Streams的惯用方法(或者只是'更惯用')?

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class DateTimeFormattingStackOverflow {
    static LocalDateTime dateTime = LocalDateTime.now();

    static Stream<String> substrings(String str) {
        return IntStream.range(1, str.length() + 1)
                .mapToObj(i -> str.substring(0, i));
    }

    static void printDateTime(String pattern) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);
        System.out.println(pattern + ", " + dtf.format(dateTime));
    }

    public static void main(String[] args) {
        Stream<String> patterns = substrings("EEEE")
                .flatMap(e -> substrings("MMMM").map(m -> e + " " + m))
                .map(em -> em …
Run Code Online (Sandbox Code Playgroud)

java substring java-stream

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

在Java 8中创建嵌套的父子列表

我是Java 8的新手,需要解决以下问题.

我有两个课程如下:

class Person {
    String name;
    int age;
    List<Address> address;
}

class Address {
    String street;
    String city;
    String country;
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个来自数据库的列表,如下所示:

List<Person> findPerson;

adam
26
<123, xyz, yyy>

adam
26
<456, rrr, kkk>

bill
31
<666, uuu, hhh>
Run Code Online (Sandbox Code Playgroud)

现在我需要将相同的人物对象与不同的地址对象组合在一起,如下所示?

List<Person> findPerson;

adam
26
<123, xyz, 456>
<456, rrr, 123>

bill
31
<666, uuu, 999>
Run Code Online (Sandbox Code Playgroud)

如何在Java 8流中完成此操作?

java iteration list java-8 java-stream

9
推荐指数
3
解决办法
1885
查看次数