说我有一个包含元素的列表(34, 11, 98, 56, 43).
使用Java 8流,如何找到列表中最小元素的索引(例如,在这种情况下为1)?
我知道这可以在Java中轻松完成list.indexOf(Collections.min(list)).但是,我正在寻找一个类似Scala的解决方案,我们可以简单地说List(34, 11, 98, 56, 43).zipWithIndex.min._2获得最小值的索引.
有没有什么可以使用流或lambda表达式(比如Java 8特定功能)来实现相同的结果.
注意:这仅用于学习目的.我在使用Collections实用程序方法时没有任何问题.
在java中,BitSet的内部数据存储为long []而不是int [],我想知道为什么?这是jdk中的代码:
/**
* The internal field corresponding to the serialField "bits".
*/
private long[] words;
Run Code Online (Sandbox Code Playgroud)
如果这完全取决于性能,我想知道为什么long []存储会获得更好的性能.
我有一组供应商,它们都有相同的结果,但速度不同(且不同).
我想要一种优雅的方式同时启动供应商,并且只要其中一个产生了价值,就将其退回(丢弃其他结果).
我已经尝试过使用并行流,Stream.findAny()但是它总是会阻塞,直到产生所有结果.
这是一个单元测试,展示了我的问题:
import org.junit.Test;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import java.util.stream.Stream;
import static org.junit.Assert.*;
public class RaceTest {
@Test
public void testRace() {
// Set up suppliers
Set<Supplier<String>> suppliers = Collections.newSetFromMap(new ConcurrentHashMap<>());
suppliers.add(() -> "fast"); // This supplier returns immediately
suppliers.add(() -> {
try {
Thread.sleep(10_000);
return "slow";
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}); // This supplier takes 10 seconds to produce a value
Stream<Supplier<String>> stream = …Run Code Online (Sandbox Code Playgroud) 我有一张地图:
Map<String, List<Object>> dataMap;
Run Code Online (Sandbox Code Playgroud)
现在我想向地图添加新的键值对,如下所示:
if(dataMap.contains(key)) {
List<Object> list = dataMap.get(key);
list.add(someNewObject);
dataMap.put(key, list);
} else {
List<Object> list = new ArrayList();
list.add(someNewObject)
dataMap.put(key, list);
}
Run Code Online (Sandbox Code Playgroud)
我如何使用Java8功能样式?
假设我有一个清单
ArrayList<String> arr = new ArrayList(Arrays.asList("N1", "N2", "N3", "N5"));
Run Code Online (Sandbox Code Playgroud)
我怎么找到"N4",我的意思是,我怎么发现丢失的整数是4?
到目前为止我尝试过的
Integer missingID = arr.stream().map(p -> Integer.parseInt(p.substring(1))).sorted()
.reduce((p1, p2) -> (p2 - p1) > 1 ? p1 + 1 : 0).get();
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为reduce在这种情况下不打算以我需要的方式工作,实际上,我不知道怎么做.如果没有丢失的数字,则必须是下一个"N6" - or just 6 -(在此示例中)
它必须使用java标准流的库,不使用第三方.
我有两个列表如下
List<String> names = Arrays.asList("James","John","Fred");
List<Integer> ages = Arrays.asList(25,35,15);
Run Code Online (Sandbox Code Playgroud)
我想要做的就是打印这两个列表
James:25
John:35
Fred:15
Run Code Online (Sandbox Code Playgroud)
使用经典方式很容易做到
for(int i=0;i<names.size();i++){
System.out.println(names.get(i)+":"+ages.get(i));
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用Stream API java 8?
我能做的是只打印一个列表
names.stream().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud) 我有一个Stream<Integer>,想知道null这个流中是否有.我该如何检查?使用.anyMatch(null)抛出我java.lang.NullPointerException.
有关性能考虑因素的问题String.substring.在Java 1.7.0_06之前,该String.substring()方法返回一个新String对象,该对象与其父对象共享相同的底层char数组,但具有不同的偏移量和长度.为了避免在只需要保留一个小子字符串时在内存中保留一个非常大的字符串,程序员习惯于编写如下代码:
s = new String(queryReturningHugeHugeString().substring(0,3));
Run Code Online (Sandbox Code Playgroud)
从1.7.0_06开始,没有必要创建一个新的,String因为在Oracle的实现中String,子串不再共享它们的底层char数组.
我的问题是:我们可以依赖Oracle(以及其他供应商)不再回到char[]未来的版本中共享,而只是这样做s = s.substr(...),或者我们是否应该显式创建一个新的String,以防JRE的未来版本开始使用共享实现再次?
为什么下面的代码不打印任何输出,而如果我们删除并行,它打印0,1?
IntStream.iterate(0, i -> ( i + 1 ) % 2)
.parallel()
.distinct()
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
虽然我知道理想的限制应该放在不同之前,但我的问题更多地与添加并行处理引起的差异有关.
我想通过一个分类器使用Java 8 Stream和Group,但是有多个Collector函数.因此,在分组时,例如计算一个场(或可能是另一个场)的平均值和总和.
我尝试用一个例子来简化这一点:
public void test() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Person One", 1, 18));
persons.add(new Person("Person Two", 1, 20));
persons.add(new Person("Person Three", 1, 30));
persons.add(new Person("Person Four", 2, 30));
persons.add(new Person("Person Five", 2, 29));
persons.add(new Person("Person Six", 3, 18));
Map<Integer, Data> result = persons.stream().collect(
groupingBy(person -> person.group, multiCollector)
);
}
class Person {
String name;
int group;
int age;
// Contructor, getter and setter
}
class Data {
long average;
long sum;
public Data(long average, long …Run Code Online (Sandbox Code Playgroud)