我正在尝试使用Java 8 Stream
来查找a中的元素LinkedList
.但是,我想保证过滤条件只有一个匹配.
拿这个代码:
public static void main(String[] args) {
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
User match = users.stream().filter((user) -> user.getId() == 1).findAny().get();
System.out.println(match.toString());
}
Run Code Online (Sandbox Code Playgroud)
static class User {
@Override
public String toString() {
return id + " - " + username;
}
int id;
String username;
public User() {
}
public User(int id, String username) {
this.id = id;
this.username = username;
}
public void setUsername(String username) …
Run Code Online (Sandbox Code Playgroud) 我升级到Android工作室3.1,我得到以下错误:
Default interface methods are only supported starting with Android N (--min-api 24): void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner)
Message{kind=ERROR, text=Default interface methods are only supported starting with Android N (--min-api 24): void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner), sources=[Unknown source file], tool name=Optional.of(D8)}
Run Code Online (Sandbox Code Playgroud)
这是我的gradle配置:
compileSdkVersion 27
//buildToolsVersion '27.0.3'
defaultConfig {
minSdkVersion 16
targetSdkVersion 27
multiDexEnabled true
//...
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,我的目标27已经领先于它抱怨的24个?我该怎么做才能解决这个问题?如果我改为1.8 java不会让我失去很多客户?为什么我在升级android studio之前没有收到此错误.
我不知道这是关于我最近投入的LifecycleObserver类,它是在kotlin中,现在我将其更改为java但在清理项目后仍然得到相同的错误:
public class LifeCycleAwareObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onAppBackgrounded() {
AnalyticsUtils.trackStartSession(true);
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onAppForegrounded() {
AnalyticsUtils.trackStartSession(false);
}
Run Code Online (Sandbox Code Playgroud)
}
如何追踪错误的来源,以便我可以修复它?
这是我的版本依赖项:
project.ext {
firebase_version …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用新的java 8 time-api和模式将Instant格式化为String:
Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);
Run Code Online (Sandbox Code Playgroud)
使用上面的代码我得到一个异常,它抱怨一个不受支持的字段:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
at java.time.Instant.getLong(Instant.java:608)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
...
Run Code Online (Sandbox Code Playgroud) 我刚刚发现了新的Java 8流功能.来自Python,我想知道现在是否有一种简洁的方法可以对数组进行操作,例如求和,以"一行pythonic"方式将两个数组相乘?
谢谢
我知道如何List
从Y
- > "转换"一个简单的Java Z
,即:
List<String> x;
List<Integer> y = x.stream()
.map(s -> Integer.parseInt(s))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在我想用Map做基本相同的事情,即:
INPUT:
{
"key1" -> "41", // "41" and "42"
"key2" -> "42 // are Strings
}
OUTPUT:
{
"key1" -> 41, // 41 and 42
"key2" -> 42 // are Integers
}
Run Code Online (Sandbox Code Playgroud)
解决方案不应限于String
- > Integer
.就像List
上面的例子一样,我想调用任何方法(或构造函数).
我试图理解Optional<T>.orElse()
和Optional<T>.orElseGet()
方法之间的区别.
该orElse()
方法的描述是"如果存在则返回值,否则返回其他值".
虽然,该orElseGet()
方法的描述是"如果存在则返回值,否则调用other并返回该调用的结果".
该orElseGet()
方法采用供应商功能接口,基本上不接受任何参数和返回T
.
你需要在哪种情况下使用orElseGet()
?如果你有一个方法,你T myDefault()
为什么不这样做optional.orElse(myDefault())
而不是optional.orElseGet(() -> myDefault())
?
似乎没有orElseGet()
将lambda表达式的执行推迟到以后的某个时间或什么的,所以有什么意义呢?(我本以为如果它返回一个更安全Optional<T>
的东西会更有用,它get()
永远不会抛出一个NoSuchElementException
并且isPresent()
总是返回真实......但显然它不是,它只是返回T
就像orElse()
).
我还缺少其他一些差异吗?
我有一个外部API返回我的日期为long
s,表示自Epoch以来的毫秒数.
使用旧式Java API,我只需用Date
它构造一个
Date myDate = new Date(startDateLong)
Run Code Online (Sandbox Code Playgroud)
Java 8 LocalDate
/ LocalDateTime
classes中的等价物是什么?
我有兴趣将长度所代表的时间点转换为long
当前本地时区.
是否有Java 8流操作限制(可能是无限的)Stream
直到第一个元素无法匹配谓词?
在Java 9中,我们可以使用takeWhile
下面的示例来打印小于10的所有数字.
IntStream
.iterate(1, n -> n + 1)
.takeWhile(n -> n < 10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
由于Java 8中没有这样的操作,以一般方式实现它的最佳方法是什么?
Java 8中有许多有用的新东西.例如,我可以在一个对象列表上迭代一个流,然后对来自Object
实例的特定字段的值求和.例如
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Run Code Online (Sandbox Code Playgroud)
因此,我问是否有任何方法可以构建一个String
连接toString()
方法的输出与单行中的实例.
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Run Code Online (Sandbox Code Playgroud)
假设list
包含整数1
,2
并且3
我希望它concatenated
是"123"
或"1,2,3"
.
我有一个列表myListToParse
,我想过滤元素并在每个元素上应用一个方法,并将结果添加到另一个列表中myFinalList
.
使用Java 8,我注意到我可以通过两种不同的方式完成它.我想知道他们之间更有效的方式,并理解为什么一种方式比另一种更好.
我对任何有关第三种方式的建议持开放态度.
方法1:
myFinalList = new ArrayList<>();
myListToParse.stream()
.filter(elt -> elt != null)
.forEach(elt -> myFinalList.add(doSomething(elt)));
Run Code Online (Sandbox Code Playgroud)
方法2:
myFinalList = myListToParse.stream()
.filter(elt -> elt != null)
.map(elt -> doSomething(elt))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)