标签: java-stream

Java8同时过滤和更改属性

通读这篇文章,我可以像这样过滤集合:

Set<Status> statusClone = cloner.deepClone(statusList).stream().filter(s -> !(s instanceof FileMetadata)).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

但是,我还需要设置属性同时过滤它们.过滤后,我目前遍历每个,然后设置属性:

for (Iterator<Status> iterator = statusClone.iterator(); iterator.hasNext();)
        {
            Status s = iterator.next();
//          if (s instanceof FileMetadata)
//          {
//              iterator.remove();
//              continue;
//          }
            s.setStatus(JobStatus.UNINITIATED);
            s.setLastAccessedTime(0);
            s.setOffSet(null);
            s.setStreamNo(null);
        }
        statusList.addAll(statusClone);
Run Code Online (Sandbox Code Playgroud)

如果不使用foreach,这在Java8中是否可行?

编辑:从评论,我同意我可以在过滤器内克隆.谢谢.

java lambda java-8 java-stream

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

流的管道如何在像IntPipeline这样的java中工作

我正在学习java 8流,有些问题对我而言.

假设这段代码:

 new Random().ints().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

它在某种程度上内部称IntPipeline,我认为有责任无限期地生成这些内容.通过查看java源代码很难理解Streams实现.

您能否给出一个简短的解释,或者给出一些关于如何生成流以及如何连接管道操作的好/易理解的材料.整数上面的代码示例是随机生成的,如何建立这种连接?

java java-8 java-stream

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

如何使用流来获取运行计数?

我上课了

class Person {
    String name;
    ....
    Optional<Integer> children;
}
Run Code Online (Sandbox Code Playgroud)

如何使用流来获取所有孩子的总数?

public int totalCount(final Set<Person> people) {
    int total = 0;
    for (Person person : people) {
        if (person.getChildren().isPresent()) {
            total += person.getChildren().get();
        }
    }
    return total; 
}
Run Code Online (Sandbox Code Playgroud)

如何使用Java 8流做到这一点?

public int totalCount(final Set<Person> people) {
    int total = 0;
    people.stream()
          .filter(p -> p.getChildren().isPresent())
          // ???
}
Run Code Online (Sandbox Code Playgroud)

java-8 java-stream

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

如何将CSV文件转换为List <Map <String,String >>

我有一个CSV文件,第一行有一个标题.我想将其转换为List<Map<String, String>>,其中Map<String, String>列表中的每个代表文件中的记录.地图的关键是标题,值是字段的实际值.到目前为止我所拥有的:

BufferedReader br = <handle to file>;
// Get the headers to build the map.
String[] headers = br.lines().limit(1).collect(Collectors.toArray(size -> new String[size]));
Stream<String> recordStream = br.lines().skip(1);
Run Code Online (Sandbox Code Playgroud)

我可以执行哪些进一步操作recordStream以便将其转换为List<Map<String, String>>?

示例CSV文件是:

header1,header2,header3   ---- Header line
field11,field12,field13   ----> need to transform to Map where entry would be like header1:field11 header2:field12 and so on.
field21,field22,field23
field31,field32,field33
Run Code Online (Sandbox Code Playgroud)

最后,需要将所有这些地图收集到列表中.

java java-8 java-stream

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

从索引创建子列表

是否可以仅使用元素索引从另一个列表创建子列表?我正在寻找一个很好的解决方案,例如lambdas,来自Java 8的流.

例如(伪代码):

a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
b = a.getByIndices([0, 2, 4, 5, 3])
print(b) // [10, 8, 6, 5, 7]
Run Code Online (Sandbox Code Playgroud)

java list sublist java-8 java-stream

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

如何使用lambda在字符串列表的某些元素中执行子字符串

下面是我的String列表.

["sunday", "monday", "tuesday", "wednesday", "fri", "satur"]
Run Code Online (Sandbox Code Playgroud)

我想要做删除"天"从元素;如果它与"天"的结局.如何在Lambda中做到这一点?

列表中的预期输出:

["sun", "mon", "tues", "wednes", "fri", "satur"]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码,但无法将值分配给列表

daysList.stream().forEach(s -> { if(s.endsWith("day")) {
        s = s.substring(0, s.indexOf("day"));
    }});
Run Code Online (Sandbox Code Playgroud)

有人可以帮我这个吗?

java foreach lambda java-stream

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

如何在Java 8中强制转换Stream.empty()?

我发现的所有示例都使用其他类型信息来推断其类型Stream.empty().似乎应该有语法允许我直接投射它.这个例子有效:

import java.util.*;
import java.util.stream.*;

class OptionalBasics {
    static void test(Optional<String> optString) {
        if(optString.isPresent())
            System.out.println(optString.get());
        else
            System.out.println("Nothing inside!");
      }
    public static void main(String[] args) {
        Stream<String> s = Stream.empty();
        test(s.findFirst());
        test(Stream.of("Epithets").findFirst());
    }
}
/* Output:
Nothing inside!
Epithets
*/
Run Code Online (Sandbox Code Playgroud)

但请注意,我必须s单独创建才能提供类型信息Stream.empty().我想在调用中创建它 test(),就像这样(这不起作用):

test(Stream<String>.empty().findFirst());
Run Code Online (Sandbox Code Playgroud)

是否有用于设置调用类型的语法Stream.empty()?

java java-8 java-stream

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

是否有更优雅的方法从流中选择max或min方法?

我希望根据某些条件从列表中获取最小或最大项目.下面的摘录总结了我在做什么:

Optional<Person> target;
if(condition){
    target = detailedList.stream().min((d1, d2) -> d1.age() + d2.age());
} else {
    target = detailedList.stream().max((d1, d2) -> d1.age() + d2.age());
}
Run Code Online (Sandbox Code Playgroud)

它有效,但相当冗长.本质上,我想在流中选择方法min或max.有一个更好的方法吗?

java java-8 java-stream

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

将大量索引项转换为流的最简单方法

鉴于一堆具有int size()方法和get(int i)方法的东西,它如何最容易流式传输?

import nu.xom.Builder;
import nu.xom.Element;
import nu.xom.Elements;

// My builder.
Builder builder = new Builder();

class Thing {
    public Thing(Element from) {
        // Construct from an Element.
    }
}

private Stream<Thing> allThings(Path path) throws FileNotFoundException, ParsingException, IOException {
    Elements things = builder.build(new FileInputStream(path.toFile()))
            .getRootElement().getChildElements();
    // Return a stream of `Thing`s created from all of the children.
    // How??
}
Run Code Online (Sandbox Code Playgroud)

我的尝试使用了一所旧式学校,Iterable并且流式传输似乎不必要的杂乱.

java java-8 java-stream

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

Java List <Map <String,Long >>映射键的组合之和

我有一个: List<Map<String, Long>> items = new ArrayList<>();

我想得到一个Map,其中键被分组,值是总和.

示例:列表

  • 项目0
    • foo - > 1
    • 吧 - > 2
  • 第1项
    • foo - > 4
    • 吧 - > 3

结果:地图

  • foo - > 5
  • 吧 - > 5

我知道如何以"长"方式执行此操作,但尝试使用java 8功能发现lambda/streaming/groupby方法.有什么想法吗?

java lambda java-8 java-stream

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

标签 统计

java-stream ×10

java ×9

java-8 ×9

lambda ×3

foreach ×1

list ×1

sublist ×1