我最近发现自己想在java.util.Map中使用一个版本的putIfAbsent(...),你可以提供某种工厂方法,以便在它尚未存在的情况下实例化一个Object.这将简化许多代码.
这是我修改过的界面:
import java.util.Map;
import java.util.function.Supplier;
/**
* Extension of the Map Interface for a different approach on having putIfAbsent
*
* @author Martin Braun
*/
public interface SupplierMap<K, V> extends Map<K, V> {
public default V putIfAbsent(K key, Supplier<V> supplier) {
V value = this.get(key);
if(value == null) {
this.put(key, value = supplier.get());
}
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:还有另一种(更简单的)方法吗?或者我只是忽略了Java API中的某些内容?
我可以通过仅使用JPA以某种方式跟踪整个Entity-Graphs状态吗?
考虑使用具有两个或三个类的层次结构,其中至少有一个Collection.
通过使用JPA @Post ... Annotations我只能跟踪实际的实体,而不是它的子项和/或集合,因为它几乎只是数据库事件包装.
我知道Hibernate可以做到这一点,但我不想依赖JPA的实现来做到这一点.
如果至少有一种方法可以使用EclipseLink,我会很高兴.
我希望Solr始终检索搜索找到的所有文档(我知道Solr不是为此而构建的,但无论如何)我目前正在使用以下代码执行此操作:
...
List<Article> ret = new ArrayList<Article>();
QueryResponse response = solr.query(query);
int offset = 0;
int totalResults = (int) response.getResults().getNumFound();
List<Article> ret = new ArrayList<Article>((int) totalResults);
query.setRows(FETCH_SIZE);
while(offset < totalResults) {
//requires an int? wtf?
query.setStart((int) offset);
int left = totalResults - offset;
if(left < FETCH_SIZE) {
query.setRows(left);
}
response = solr.query(query);
List<Article> current = response.getBeans(Article.class);
offset += current.size();
ret.addAll(current);
}
...
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是如果查询超过1000次点击则相当慢(我在这里读到了这个.这是由Solr引起的,因为我每次都设置启动 - 由于某种原因 - 需要一些时间).什么是更好(和更快)的方法来做到这一点?