执行中间函数而不调用最终函数forEach()

时间:2017-09-20 12:50:10

标签: java lambda

我的代码读入people.txt,构造了许多人物对象并将其添加到人员列表中。 但是如果我删除forEach,则不会执行stream.map()函数,因为它是一个中间函数,因此我需要forEach或任何其他最终函数。

但是,我不希望在forEach函数中执行任何Consumer lambda(在本例中为print语句)。我该怎么做?

我的主要方法:

public static void main(String[] args) {

    List<Person> persons=new ArrayList<>();

    try(
            BufferedReader reader=
                new BufferedReader(
                        new InputStreamReader(
                                Main.class.getResourceAsStream("people.txt")));

        Stream<String> stream=reader.lines();

    ){

            stream.map(line->{
                String[] s=line.split(" ");
                Person p=new Person(
                        s[0].trim(),
                        Integer.parseInt(s[1]),
                        s[2].trim()
                );
                persons.add(p);
                return p;
            }).forEach(System.out::print);

    }catch(IOException e){
        System.out.println(e);
    }

3 个答案:

答案 0 :(得分:1)

List<Person> persons = stream.map(line->{
        String[] s=line.split(" ");
        Person p=new Person(
                s[0].trim(),
                Integer.parseInt(s[1]),
                s[2].trim()
        }).collect(Collectors.toList());

如果您想使用自定义列表而不是.collect(Collectors.toCollection(persons))

答案 1 :(得分:0)

如果您不打算收集它,您不必映射任何内容。 通过将它们添加到列表中,您已经在使用它们,因此您可以执行以下操作:

stream.forEach(line->{
            String[] s=line.split(" ");
            Person p=new Person(
                    s[0].trim(),
                    Integer.parseInt(s[1]),
                    s[2].trim()
            );
            persons.add(p);
        })

这样你仍然可以填写清单。 此外,你可以做的是

stream.map(line->{
            String[] s=line.split(" ");
            Person p=new Person(
                    s[0].trim(),
                    Integer.parseInt(s[1]),
                    s[2].trim()
            );
            return p;
        }).forEach(persons::add);

另外,你不应该在你的地图功能中做任何副作用,这会给列表添加一些东西。 map()应仅用于将内容映射到流,向列表添加内容是消费它的方式。如果这是您向人员列表添加内容的唯一地方,您也可以执行以下操作:

persons = stream.map(line->{
        String[] s=line.split(" ");
        Person p=new Person(
                s[0].trim(),
                Integer.parseInt(s[1]),
                s[2].trim()
        );
        return p;
    }).collect(Collectors.toList());

答案 2 :(得分:0)

使用唯一Stream API的更紧凑的解决方案:

try (BufferedReader reader = new BufferedReader(new InputStreamReader(
                Main.class.getResourceAsStream("people.txt")))) {
            List<Person> peoples = reader.lines()
                    .map(line -> line.split(" "))
                    .map(tuple -> new Person(
                            tuple[0].trim(),
                            Integer.parseInt(tuple[1]),
                            tuple[2].trim()
                    ))
                    .collect(Collectors.toList());
            peoples.forEach(System.out::println);
        } catch (IOException e) {
            System.out.println(e);
        }