我得到了一个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) 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函数引用.
我目前这样做:
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 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-不休息加入游泳池的工作)?
我可以将一个单词列表收集到一个包中(也称为多组):
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内置的东西吗?
我正在将一段代码从.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) 我想提前澄清我正在寻找一种使用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 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
我有以下的代码,遍历对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 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 ×10
java-stream ×10
java-8 ×8
dictionary ×2
collect ×1
concurrency ×1
fork-join ×1
forkjoinpool ×1
iteration ×1
lambda ×1
list ×1
substring ×1