我想在列表中添加第二个过滤器,我想排除空字符串旁边的字符串列表中的副本.
以下是我尝试使用流API的方法:
这将区分结果,但不是空的
List<User> users = userService.getUsers(form.getId());
List<String> positionNames = users.stream().map(User::getTitle).distinct().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我怎样才能将它们组合在一起?
class Human {
Long humanId;
String name;
Long age;
}
class SuperHuman {
Long superHumanId;
Long humanId;
String name;
Long age;
}
Run Code Online (Sandbox Code Playgroud)
我有两个清单.人类名单和superHumans名单.我想从两个中创建一个单独的列表,确保如果一个人是超人,它只会在使用java 8的列表中出现一次.有一个巧妙的方法吗?更新:这些是不同的类,即不扩展另一个.我想最终的名单是超人.如果一个人已经是超人,我们就会忽视那个人类的对象.如果人类不是超人,我们将人类对象转换为超人类对象.理想情况下,我希望按照他们的年龄对它们进行排序,以便获得按日期降序排序的超人列表.
我们大多数人都了解共享可变性的后果,并且据说如果你有机会,总是更喜欢不变性(最终修饰符,设置一次,你不能改变它).我已经看到很少的编码示例,其中People实际上将字段final或setter设置为private或甚至删除类的setter(可以是DTO,Model或Entity类)和另一个类(可以将值设置为不可变的一个构建器类) class)用于创建和设置Immutable类的字段确保没有其他类能够修改状态.这似乎是我的负担.所以我想出了这个想法(下面我举一个例子)
public class TestDataClass {
private String name;
public String getName() {
return name;
}
public void setName(Supplier<String> supplier) throws Exception {
if(Objects.isNull(name))
this.name = supplier.get();
throw new Exception("This field is immutable and already has a value "+this.name);
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,你可以通过这样的setter设置值,objectOfTestDataClass.setName(() -> {return Perform_Desired_Logic;});
或者
objectOfTestDataClass.setName(() ->"My Name");它是普通的setter.然后你也不必创建一个bulder类或使setter私有或省略setter方法
通过这种方式,一旦你将字段设置为Immutable(我不考虑反射),我也可以在实例化期间摆脱变量初始化.
我希望您的专家意见能够验证我的想法是否合法,我可以将其视为不变性吗?我错过了什么吗?在那种情况下,请纠正我.
Map<String, Integer> hm = new HashMap<>();
//assume hm is populated
if(hm.containValue(***){ ... }
// *** = contains even number
Run Code Online (Sandbox Code Playgroud)
我尝试做类似的事情,(x -> x % 2 == 0)但它不起作用.
有什么建议?
以下代码输出始终为24.
public static void main(String[] args) throws InterruptedException {
List<String> list = new ArrayList<String>();
list.add("java");
list.add("php");
list.add("python");
list.add("perl");
list.add("c");
list.add("lisp");
list.add("c#");
int s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> 0);
System.out.println(s);
s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> x - y);
System.out.println(s);
s = list.stream().reduce(0, (x, y) -> x + y.length(), (x, y) -> x * y);
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
问题是组合器影响我的代码的原因.
如何在Java 8中实现以下功能java.time:
DateTime dt = new DateTime(year, month, date, hours, min, sec, milli);
Run Code Online (Sandbox Code Playgroud)
但我找到了这个选项:
OffsetDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, offset)
Run Code Online (Sandbox Code Playgroud)
但它只有毫秒的方法.
我怎样才能达到与Joda-Time相同的效果?
我是Reactive的新手.使用JDK 1.8,如何将这些命令式代码转换为Reactive风格.
List<int> evenArr, oddArr, arr;
// pretending 'arr' have some values, 'evenArr' & 'oddArr' have already init
for (int n : arr) {
if (n%2) evenArr.add(n);
else oddArr.add(n);
}
Run Code Online (Sandbox Code Playgroud)
现在我只想到两次搜索'arr',如:
arr.stream().filter(n -> n%2).foreach(evenArr::add);
arr.stream().filter(n -> n%2!=0).foreach(oddArr::add);
Run Code Online (Sandbox Code Playgroud)
还有其他方法吗?搜索'arr'两次是昂贵的.
我试图在过滤器中对字段进行排序.
输入文件/样本记录:
DocumentList: [
Document{
{
_id=5975ff00a213745b5e1a8ed9,
u_id=,
mailboxcontent_id=5975ff00a213745b5e1a8ed8,
idmapping=Document{
{ptype=PDF, cid=00988, normalizedcid=00988, systeminstanceid=, sourceschemaname=, pid=0244810006}
},
batchid=null,
pdate=Tue Jul 11 17:52:25 IST 2017, locale=en_US
}
},
Document{
{
_id=597608aba213742554f537a6,
u_id=,
mailboxcontent_id=597608aba213742554f537a3,
idmapping=Document{
{platformtype=PDF, cid=00999, normalizedcid=00999, systeminstanceid=, sourceschemaname=, pid=0244810006}
},
batchid=null,
pdate=Fri Jul 28 01:26:22 IST 2017,
locale=en_US
}
}
]
Run Code Online (Sandbox Code Playgroud)
在这里,我需要根据pdate进行排序.
List<Document> outList = documentList.stream()
.filter(p -> p.getInteger(CommonConstants.VISIBILITY) == 1)
.parallel()
.sequential()
.collect(Collectors.toCollection(ArrayList::new))
.sort()
.skip(skipValue)
.limit(limtValue);
Run Code Online (Sandbox Code Playgroud)
不知道如何排序
"order by pdate DESC"
Run Code Online (Sandbox Code Playgroud)
先感谢您!
(最后的实际问题)
你好,世界!我在这里发生了一些令人不安的事情,我无法绕过头...
像我一样懒惰,我讨厌一遍又一遍地重新实施愚蠢的euqals()方法; 还有hashCode()方法,但仍然关注选定成员变量的"相等".我还可以通过使用检查类实例或使用反射的默认接口来减少实现,但我想我已经使用了这个静态实用程序方法和labmda:
public class StackOverflow_TestEq {
static public interface JcLambda_pG1_pG1_rBool<T> {
boolean test(T p1, T p2);
}
static public <T> boolean equals_internal(final T pThisObject, final Object pOtherObject, final JcLambda_pG1_pG1_rBool<T> pEqualizer) {
if (pThisObject == null) return pOtherObject == null;
if (pOtherObject == null) return false;
final Class<? extends Object> thisClass = pThisObject.getClass();
if (!thisClass.isInstance(pOtherObject)) return false;
@SuppressWarnings("unchecked") final T other = (T) pOtherObject;
final boolean res = pEqualizer.test(pThisObject, other);
// System.out.println("Testing " + pThisObject + " vs " …Run Code Online (Sandbox Code Playgroud) 我创建了一个方法来检查列表中是否有一个具有特定id的元素,如果它不存在则抛出异常.我只是不知道如何检查match值是否false,然后抛出我的异常AccessToMessageForbiddenException.
private void validMessage(Long messageId) {
List<Message> messageList = messageService.findBySender(1L);
messageList.addAll(messageService.findByRecipient(1L));
boolean match = messageList.stream().anyMatch(v -> messageId.equals(v.getId()));
//How to throw an exception without an if construct
}
Run Code Online (Sandbox Code Playgroud)