返回Java Streams中的N个最后元素

Gui*_*i13 1 java string split java-8 java-stream

这个问题只是为了好玩.

我有这个方法:

private static String getBaseDomain(String fullDomain) {
    // we take the base domain from the usual xxx.yyy.basedomain.tld: we 
    // want only the last 2 elements: basedomain.tld
    List<String> elements = Arrays.asList(fullDomain.split("\\."));
    if( elements.size() > 2){
        elements = elements.subList(elements.size()-2, elements.size());
    }
    return String.join(".", elements);
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何使用java流API获得相同的结果(实际上,我想知道哪种方法是最节省资源的).

我无法想象如何仅从流中获取最后2个元素:limit(2)将给出两个元素,并且skip(XXX)我不知道如何提取流"inline"的大小.

你能告诉我你会怎么做吗?

Men*_*ena 7

你可以使用skip:

elements.stream().skip(elements.size() - 2)
Run Code Online (Sandbox Code Playgroud)

来自API:

在丢弃流的前n个元素后,返回由此流的其余元素组成的流.如果此流包含少于n个元素,则将返回空流.

可能没用的例子:

// a list made of a, b, c and d
List<String> l = Arrays.asList("a", "b", "c", "d");

// prints c and d
l.stream().skip(l.size() - 2).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

可能没用的注意事项:

正如少数人所提到的,这只适用于你有一个可以使用的大小,即如果你是从一个集合流式传输.

引用尼古拉斯,一条小溪没有大小.

  • 可能是双卷曲反模式的最差应用.怎么样`List <String> l = Arrays.asList("a","b","c","d");`?或者如果它必须是`ArrayList`:`List <String> l = new ArrayList <>(); Collections.addAll(l,"a","b","c","d");`... (2认同)