小编Tag*_*eev的帖子

Java 8,Streams查找重复元素

我试图列出整数列表中的重复元素,例如,

List<Integer> numbers = Arrays.asList(new Integer[]{1,2,1,3,4,4});    
Run Code Online (Sandbox Code Playgroud)

使用jdk的Streams 8.有没有人试过.要删除重复项,我们可以使用distinct()api.但是如何找到重复的元素呢?有人可以帮帮我吗?

java lambda java-8 java-stream

70
推荐指数
6
解决办法
11万
查看次数

为什么Arrays.fill()不再用于HashMap.clear()了?

我注意到在执行中有些奇怪HashMap.clear().这就是它在OpenJDK 7u40中的表现:

public void clear() {
    modCount++;
    Arrays.fill(table, null);
    size = 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是OpenJDK 8u40的外观:

public void clear() {
    Node<K,V>[] tab;
    modCount++;
    if ((tab = table) != null && size > 0) {
        size = 0;
        for (int i = 0; i < tab.length; ++i)
            tab[i] = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道现在table为空地图可以为null,因此需要在局部变量中进​​行额外的检查和缓存.但为什么被Arrays.fill()for-loop取代?

似乎在此提交中引入了更改.不幸的是,我没有找到解释为什么普通for循环可能比更好Arrays.fill().它更快吗?还是更安全?

java arrays hashmap java-8

70
推荐指数
1
解决办法
4627
查看次数

迭代时在Java8中修改流内的对象

在Java8流中,我可以修改/更新其中的对象吗?例如.List<User> users:

users.stream().forEach(u -> u.setProperty("value"))
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

68
推荐指数
2
解决办法
9万
查看次数

Java 8中findAny()和findFirst()之间的区别

我有点困惑之间Stream#findAny(),并Stream#findFirst()在的 Stream在Java API 8.

我理解的是,两者都将从流中返回第一个匹配的元素,例如,当与过滤器一起使用时?

那么,为什么两种方法相同的任务呢?我错过了什么吗?

java java-8 java-stream

67
推荐指数
4
解决办法
3万
查看次数

如果不存在,如何在Optional上执行逻辑?

我想用java8替换下面的代码Optional:

public Obj getObjectFromDB() {
    Obj obj = dao.find();
    if (obj != null) {
        obj.setAvailable(true);
    } else {
        logger.fatal("Object not available");
    }

    return obj;
}
Run Code Online (Sandbox Code Playgroud)

以下伪代码不起作用,因为没有orElseRun方法,但无论如何它说明了我的目的:

public Optional<Obj> getObjectFromDB() {
    Optional<Obj> obj = dao.find();
    return obj.ifPresent(obj.setAvailable(true)).orElseRun(logger.fatal("Object not available"));
}
Run Code Online (Sandbox Code Playgroud)

java optional java-8

65
推荐指数
8
解决办法
9万
查看次数

Java 8 Stream:limit()和skip()之间的区别

谈论Streams,当我执行这段代码时

public class Main {
    public static void main(String[] args) {
        Stream.of(1,2,3,4,5,6,7,8,9)
        .peek(x->System.out.print("\nA"+x))
        .limit(3)
        .peek(x->System.out.print("B"+x))
        .forEach(x->System.out.print("C"+x));
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出

A1B1C1
A2B2C2
A3B3C3
Run Code Online (Sandbox Code Playgroud)

因为将我的流限制为前三个组件会强制执行动作A,BC三次.

尝试使用skip()方法对最后三个元素执行类似的计算,显示了不同的行为:这

public class Main {
    public static void main(String[] args) {
        Stream.of(1,2,3,4,5,6,7,8,9)
        .peek(x->System.out.print("\nA"+x))
        .skip(6)
        .peek(x->System.out.print("B"+x))
        .forEach(x->System.out.print("C"+x));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出这个

A1
A2
A3
A4
A5
A6
A7B7C7
A8B8C8
A9B9C9
Run Code Online (Sandbox Code Playgroud)

在这种情况下,为什么执行A1A6的操作?它必须与limit是一个短路状态中间操作这一事实有关,而skip不是,但我不明白这个属性的实际含义.是不是"在跳过之前的所有动作都被执行而不是每个人都在限制之前"?

java skip limit java-8 java-stream

61
推荐指数
4
解决办法
5万
查看次数

用流映射的Java 8列表

我有一个List<Item>集合.我需要将其转换Map<Integer, Item> 为映射的键必须是集合中项的索引.我无法弄清楚如何使用流来做到这一点.就像是:

items.stream().collect(Collectors.toMap(...));
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

由于这个问题被确定为可能重复,我需要补充一点,我的具体问题是 - 如何获取列表中项目的位置并将其作为键值

java collections dictionary java-8 java-stream

49
推荐指数
4
解决办法
7万
查看次数

如何在流式传输时删除HashMap的元素(lambda)

我有以下情况需要从流中删除元素.

map.entrySet().stream().filter(t -> t.getValue().equals("0")).
            forEach(t -> map.remove(t.getKey()));
Run Code Online (Sandbox Code Playgroud)

在Java 8之前的代码中,可以从迭代器中删除 - 在这里处理这种情况的最佳方法是什么?

java dictionary iterator java-stream

45
推荐指数
2
解决办法
3万
查看次数

避免使用Stream的NoSuchElementException

我有以下内容Stream:

Stream<T> stream = stream();

T result = stream.filter(t -> {
    double x = getX(t);
    double y = getY(t);
    return (x == tx && y == ty);
}).findFirst().get();

return result;
Run Code Online (Sandbox Code Playgroud)

但是,并不总是有一个结果给我以下错误:

NoSuchElementException:没有值存在

那么null如果没有价值,我怎么能回来?

java optional java-8 java-stream

43
推荐指数
2
解决办法
5万
查看次数

带ResultSet的java.util.stream

我有几张包含大量数据的表(大约1亿条记录).所以我不能将这些数据存储在内存中,但是我希望使用类来传输这个结果集java.util.stream并将此流传递给另一个类.我读了关于Stream.ofStream.Builder运算符,但它们是内存中的缓冲流.那么有什么方法可以解决这个问题吗?提前致谢.

更新#1

好吧,我用Google搜索并找到了jooq库.我不确定,但看起来它可能适用于我的测试用例.总而言之,我有几张包含大量数据的表格.我想流式传输我的结果集并将此流传输到另一个方法.像这样的东西:

// why return Stream<String>? Because my result set has String type
private Stream<Record> writeTableToStream(DataSource dataSource, String table) {

    Stream<Record> record = null;
    try (Connection connection = dataSource.getConnection()) {
        String sql = "select * from " + table;

        try (PreparedStatement pSt = connection.prepareStatement(sql)) {
            connection.setAutoCommit(false);
            pSt.setFetchSize(5000);
            ResultSet resultSet = pSt.executeQuery();
            //
            record = DSL.using(connection)
                    .fetch(resultSet).stream();
        }
    } catch (SQLException sqlEx) {
        logger.error(sqlEx);
    }

    return record;
}
Run Code Online (Sandbox Code Playgroud)

可以请有人建议,我是否正确?谢谢.

更新#2

我在 …

java lambda jdbc jooq java-stream

42
推荐指数
3
解决办法
4万
查看次数

标签 统计

java ×10

java-8 ×8

java-stream ×8

dictionary ×2

lambda ×2

optional ×2

arrays ×1

collections ×1

hashmap ×1

iterator ×1

jdbc ×1

jooq ×1

limit ×1

skip ×1