我有一个对象列表,其中有许多重复,有些字段需要合并.我想将它简化为仅使用Java 8 Streams的唯一对象列表(我知道如何通过old-skool方法执行此操作,但这是一个实验.)
这就是我现在所拥有的.我真的不喜欢这个,因为地图构建看起来无关紧要,而且values()集合是支持地图的视图,你需要将它包装成一个新的ArrayList<>(...)以获得更具体的集合.有没有更好的方法,也许使用更一般的减少操作?
@Test
public void reduce() {
Collection<Foo> foos = Stream.of("foo", "bar", "baz")
.flatMap(this::getfoos)
.collect(Collectors.toMap(f -> f.name, f -> f, (l, r) -> {
l.ids.addAll(r.ids);
return l;
})).values();
assertEquals(3, foos.size());
foos.forEach(f -> assertEquals(10, f.ids.size()));
}
private Stream<Foo> getfoos(String n) {
return IntStream.range(0,10).mapToObj(i -> new Foo(n, i));
}
public static class Foo {
private String name;
private List<Integer> ids = new ArrayList<>();
public Foo(String n, int i) {
name = n;
ids.add(i);
}
}
Run Code Online (Sandbox Code Playgroud) 我经常读到IOC中的服务定位器是一种反模式.
去年我们将IOC(特别是Ninject)介绍给了我们的工作应用程序.该应用程序是遗留的,它非常大,而且它是碎片化的.有很多方法可以创建类或类链.有些是由Web框架(自定义)创建的,有些是由nHibernate创建的.很多地方都散落在奇怪的地方.
我们如何处理不同的场景,而不是提出一些至少不是ServiceLocatorish的东西,而不是在不同的地方使用不同的内核(像singleton,HttpRequest和thread这样的范围很重要).
编辑我将添加更多细节,以便我们了解当前的SL模式.
事实上,我们不希望多个内核.我们只想要一个(实际上因为SL我们只有一个静态的).这是我们的设置:
1)我们在7-8个不同的项目/组件中有Ninject模块.当我们的应用程序(webapp)启动时,模块通过程序集扫描收集并加载到内核中并放置在服务定位器中.所以这一切都相当昂贵.
2)我们有一个自定义UI框架,结构很开心.想想大约120个选项卡表单,每个表单构建1-10个标签页作为其生命周期的一部分.SL战略性地用于5-6个地方,其覆盖所有这些作为纯分辨率或仅进行后实例化注入属性.
3)UI下的任何内容都不在那些顶级调用中,如果这些类想要使用IOC,他们需要提出自己的策略.有各种不同的小框架,每个框架都是他们自己的小世界.
因此,从我所阅读的内容中做到这一点的理想方法是在需要访问IOC时注入内核......这一切都很好,很好; 我们确实将SL的使用保持在最低限度.
但是我从哪里获得这个内核?我不想在任何地方构建和注册新的.似乎我必须从静态上下文或工厂中获取它,因此我可以确保我正在使用的内核保持其他人正在使用的相同范围的对象,并且还要避免注册所有模块.在那一点上,无论那个东西看起来很像服务定位器吧?
请记住,这个应用程序是巨大的,紧密耦合.我们没有多次花几个月的时间来重构它.对于我们来说,SL似乎是一种很好的方式,可以在我们有时间的地方慢慢地工作.
castle-windsor ninject ioc-container unity-container service-locator
为什么此测试失败:
DateTime dateTime = new DateTime(1997,01,01,00,00,00,00, DateTimeZone.UTC);
long jodaMills = dateTime.getMillis();
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.set(1997,01,01,00,00,00);
long calMills = cal.getTimeInMillis();
Assert.assertEquals(jodaMills, calMills);
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:预期:852076800000实际:854755200964
它们不应该是相同的数字吗?
问候,我想让NUnit每次都以随机顺序执行我的单元测试,以确保它们是孤立的并且是FIRST.有没有人知道如何在不分支NUnit的情况下轻松完成这项工作?
在将应用程序升级到Java 8时,我newArrayList在几个地方遇到了谷歌番石榴的奇怪问题.
看看这个例子:
import com.google.common.collect.UnmodifiableIterator;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.BasicAttribute;
import java.util.ArrayList;
import static com.google.common.collect.Iterators.forEnumeration;
import static com.google.common.collect.Lists.newArrayList;
public class NewArrayListIssue {
public static void main(String[] args) throws NamingException {
UnmodifiableIterator<?> elements = forEnumeration(getEnumeration().getAll());
System.out.println("declarefirst = " + newArrayList(elements)); // calls newArrayList(Iterator<? extends E> elements)
ArrayList directCopy = newArrayList(forEnumeration(getEnumeration().getAll()));
System.out.println("useDirectly = " + directCopy); //calls newArrayList(E... elements)
}
public static Attribute getEnumeration(){
return new BasicAttribute("foo",1);
}
}
Run Code Online (Sandbox Code Playgroud)
在第一个例子中,当我得到第UnmodifiableIterator一个进入它自己的变量,然后调用newArrayList我得到我期望的,这是Iterators值复制到一个新的List.
在forEnumeration直接进入 …
我正在将Ninject引入现有项目的大量混乱中.我想写一个诊断测试,以确保Ninject最终创建的所有类实际上可以由Ninject解决...而不实际创建任何类.
我想避免实际构造的原因是这些类中的许多类都倾向于在它们的构造函数中启动数据库操作(叹息是的,我知道).否则我会Get<T>用try/catch 来运行它们
问候,
我为一个项目(1000+)进行了大量的fitnesse测试.随着时间的推移,随着功能的变化,以及共享装置的出现,我们将留下未使用的孤立代码.但是怎么找到它?
对于那些不知道如何适合的人,你有一个像这样的维基页面:
| 当用户添加| 1 | 和| 2 | 他被退回了 3 |
在运行时将其映射到以下方法:
public bool WhenAUserAddsAndHeIsReturned(int first, int second, int expectedResult){
return ((first + second) == expectedResult)
}
Run Code Online (Sandbox Code Playgroud)
手工找到所有这些映射将是苦差事,写一个脚本来做这将是一项漫长而艰巨的任务.我相信一定有更好的解决方案.
是否有一个实用程序可以在测试运行时监视夹具dll,然后返回所有未运行的类和方法的列表?
我正在将我的Spring Security从3.1.0升级到3.1.3并遇到了一个破坏我的设置的更改.
我一直在使用自定义SecurityExpressionRoot来公开一个与intercept-url条目一起使用的方法.
<http entry-point-ref="forbiddenAccessEntryPoint" use-expressions="true" create-session="never"
access-decision-manager-ref="webAccessDecisionManager">
<intercept-url pattern="/licenses*" access="hasProjectAuthority('LICENSES')"/>
Run Code Online (Sandbox Code Playgroud)
SecurityExpressionRoot通过自定义DefaultMethodSecurityExpressionHandler注入.
这在3.1.0中工作正常,但在升级到3.1.3后,Spring无法评估"hasProjectAuthority"方法:
EL1004E:(pos 0):方法调用:在org.springframework.security.web.access.expression.WebSecurityExpressionRoot类型中找不到方法hasProjectAuthority(java.lang.String)
这个搬家了吗?
我有一个应用程序数据库,其中在不同的服务器上有许多不同的模式副本(开发人员,雄鹿,生物等)
我有两张表与FK禁令有关
Foo.fk = Bar.Id
Run Code Online (Sandbox Code Playgroud)
我想放下吧台.但我不想放弃Foo.fk列.我只是想从中删除约束.
问题是最初创建约束的脚本在不同的环境中使它不同.除了按名称删除之外,有没有办法通过某种方式删除约束?
在Java 8中,看起来类的lambda保存在数组中.例如,假设我们有这个类:
public class LambdaFactory {
public Supplier<Integer> getOne(){
return () -> 42;
}
public Supplier<Integer> getTwo(){
return () -> 128;
}
public Supplier<Integer> getThree(){
return () -> 3;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我这样打印出来:
System.out.println(factory.getOne());
System.out.println(factory.getOne());
System.out.println(factory.getTwo());
System.out.println(factory.getThree());
Run Code Online (Sandbox Code Playgroud)
输出将是这样的
examples.LambdaFactory$$Lambda$1@4e515669
examples.LambdaFactory$$Lambda$1@4e515669
examples.LambdaFactory$$Lambda$2@1b9e1916
examples.LambdaFactory$$Lambda$3@ba8a1dc
Run Code Online (Sandbox Code Playgroud)
所以我们在这里可以看到两件事.两次调用的lambda给了我们相同的lambda对象(这与我们每次都可以得到一个新的内部类不同).我们也看到他们看起来像是被保留在某种类型的"Lambda"结构中
我的问题是,我可以在课堂上看到lambdas吗?我没有任何理由这样做,我只是喜欢解剖一些东西