我试图列出整数列表中的重复元素,例如,
List<Integer> numbers = Arrays.asList(new Integer[]{1,2,1,3,4,4});
Run Code Online (Sandbox Code Playgroud)
使用jdk的Streams 8.有没有人试过.要删除重复项,我们可以使用distinct()api.但是如何找到重复的元素呢?有人可以帮帮我吗?
我注意到在执行中有些奇怪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().它更快吗?还是更安全?
在Java8流中,我可以修改/更新其中的对象吗?例如.List<User> users:
users.stream().forEach(u -> u.setProperty("value"))
Run Code Online (Sandbox Code Playgroud) 我有点困惑之间Stream#findAny(),并Stream#findFirst()在的 Stream在Java API 8.
我理解的是,两者都将从流中返回第一个匹配的元素,例如,当与过滤器一起使用时?
那么,为什么两种方法相同的任务呢?我错过了什么吗?
我想用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) 谈论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,B和C三次.
尝试使用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)
在这种情况下,为什么执行A1到A6的操作?它必须与limit是一个短路状态中间操作这一事实有关,而skip不是,但我不明白这个属性的实际含义.是不是"在跳过之前的所有动作都被执行而不是每个人都在限制之前"?
我有一个List<Item>集合.我需要将其转换Map<Integer, Item>
为映射的键必须是集合中项的索引.我无法弄清楚如何使用流来做到这一点.就像是:
items.stream().collect(Collectors.toMap(...));
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
由于这个问题被确定为可能重复,我需要补充一点,我的具体问题是 - 如何获取列表中项目的位置并将其作为键值
我有以下情况需要从流中删除元素.
map.entrySet().stream().filter(t -> t.getValue().equals("0")).
forEach(t -> map.remove(t.getKey()));
Run Code Online (Sandbox Code Playgroud)
在Java 8之前的代码中,可以从迭代器中删除 - 在这里处理这种情况的最佳方法是什么?
我有以下内容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如果没有价值,我怎么能回来?
我有几张包含大量数据的表(大约1亿条记录).所以我不能将这些数据存储在内存中,但是我希望使用类来传输这个结果集java.util.stream并将此流传递给另一个类.我读了关于Stream.of和Stream.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 ×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