我观看了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)
它似乎是更好的表现.
所以这是我的问题:为什么第二个代码更好,是否有更好的,或者至少成本更低的方法呢?
在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一致?
我有以下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流?
拥有如下清单
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-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) 我正在尝试创建一个泛型函数,该函数基于一个字符串构建任何类型的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)
我有两个问题.
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) 我想整理一个简单的清单.示例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)
结果:没有打印出来!没有应用排序.因此,甚至不执行排序方法.为什么?
旁注:我的目的是直接修改列表(在一个对象中),因此我试图阻止创建一个新列表.
我有一套钥匙.
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在多个线程之间共享实例是否安全?
为什么我有下一个例外?
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) 我在理解流时遇到了一些麻烦.我环顾四周,似乎无法找到与我的用例匹配的示例.
我有一个现有的嵌套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.