所以我正在阅读泛型和函数式接口。显示了两种方法 - 使用 Lambda,使用方法引用。使用了以下示例:
Predicate<String> ref = String::isEmpty;
Run Code Online (Sandbox Code Playgroud)
Java 使用在运行时提供的参数作为调用 isEmpty 的实例。这是允许的,因为 isEmpty() 是 String 类中的一个实例方法并且不带任何参数。
我的问题是,当我使用以下代码行时,为什么会显示编译错误:
Supplier<Integer> ref2 = Random::nextInt;
Run Code Online (Sandbox Code Playgroud)
毕竟 nextInt() 是 Random 类中的实例方法,就像 String 类中的 isEmpty() 一样,它也不带参数。
我是 JBoss Fuse 服务器的新手。我们使用的 Fuse 服务器版本是 7.2。根据位置undertow.xml文件${karaf.home}/etc,我们目前支持TLSv1,TLSv1.1和TLSv1.2. 要求是添加更高版本(TLSv1.3在这种情况下)。我想检查先决条件和可行性方面。
另外,我无法确定 Fuse 7.2 是否可以支持TLSv1.3。
我们正在使用 Java 8。
任何可以引导我的信息/方向都受到高度赞赏。
我有一个地图数组。其中我需要做一些计算并返回另一个 Map 并将相同的键计数添加到结果中的值中。我试过下面的一个。但由于它是并行运行的,因此不会添加它。
请帮助改进它
我可以在正常的 for 循环中实现这一点。
public Map<Long,Long> solve(Map<String,Stats>... map){
Map<Long,Long> resultCount = new HashMap<Long,Long>();
if(map != null){
resultCount = Arrays.stream(map).filter(Objects::nonNull).map(map -> getUserCountMap(map))
.collect(HashMap::new, Map::putAll, Map::putAll);
}
return resultCount;
}
public Map<Long,Long> getUserCountMap(Map<String, Stats> map) {
Map<Long,Long> resultCount = new HashMap<Long,Long>();
map.forEach((k,v)->{
try {
String key = (String) k;
Stats userValue = (Stats) v;
Long userId = new Long(key);
System.out.println("key :::"+key+":::"+resultCount.getOrDefault(userId, 0l));
Optional<Long> count = userValue.getCount();
System.out.println(count.get());
count.ifPresent(aLong -> resultCount.put(userId, (resultCount.getOrDefault(userId, 0l) + aLong)));
System.out.println(resultCount);
} catch (Exception e) …Run Code Online (Sandbox Code Playgroud) 在我的代码中,我们必须将欧元转换为欧分:将 aBigDecimal作为输入,我们必须将其乘以 100。
我们需要多次应用这种转换,所以我们决定使用UnaryOperatorfrom java.util.function:
private static final UnaryOperator<BigDecimal> CONVERT_EURO_TO_CENTS =
input -> input.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN);
Run Code Online (Sandbox Code Playgroud)
然后我们使用CONVERT_EURO_TO_CENTS如下:
[.....]
CONVERT_EURO_TO_CENT.apply(<aBigDecimal>)
[.....]
Run Code Online (Sandbox Code Playgroud)
将 声明UnaryOperator为常量 ( static final)可能是危险的,以避免多线程环境中的数据不一致(线程安全)?
我有一个方法如下:
void updateObject(ObjOne obj, SomeClass data) {
if(obj != null) {
obj.doSomething(data);
}
}
Run Code Online (Sandbox Code Playgroud)
在updateObject多次调用,避免空检查在每一个地方,我想避免以下的:
// directly invoke doSomething conditionally.
if(obj != null) {
SomeClass data = getData();
obj.doSomething(data);
}
Run Code Online (Sandbox Code Playgroud)
由于data仅在obj非空时使用,我想到了如下重构代码:
void updateObject(ObjOne obj, Supplier<SomeClass> data) {
if(obj != null) {
obj.doSomething(data.get());
}
}
Run Code Online (Sandbox Code Playgroud)
这将SomeClass仅在需要时创建一个对象,而是创建一个Supplier类型的对象。
上述方法使用Supplier更好吗?
我被困在试图找出每个单词出现的句子中。该条目将是一个句子列表
Question, what kind of wine is best?
White wine.
A question
Run Code Online (Sandbox Code Playgroud)
输出将是
// format would be: word:{count: sentence1, sentence2,...}
a:{1:3}
wine:{2:1,2}
best:{1:1}
is:{1:1}
kind:{1:1}
of:{1:1}
question:{2:1,3}
what:{1:1}
white:{1:2}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所得到的:
static void getFrequency(List<String> inputLines) {
List<String> list = inputLines.stream()
.map(w -> w.split("[^a-zA-Z0-9]+"))
.flatMap(Arrays::stream)
.map(String::toLowerCase)
.collect(Collectors.toList());
Map<String, Integer> wordCounter = list.stream()
.collect(Collectors.toMap(w -> w, w -> 1, Integer::sum));
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我只能得到每个单词出现在所有句子中的次数,但我还需要获得该单词出现的句子列表。看起来也许是为了获取我可以使用的句子的 id IntStream.range,如下所示:
IntStream.range(1, inputLines.size())
.mapToObj(i -> inputLines.get(i));
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否是最好的方法,我是 Java 新手
我正在学习 java 中的 lambda 表达式。我有使用“for”循环的代码,如下所示:
for (RoutingCode routingCode: referencesDao.getRoutingCodes()) {
ReferencesUtil.routingCodeToXml(references.addElement("referenceType"), routingCode);
for (AutoCreateIssue ac: referencesDao.getAutoCreateIssues(routingCode.getId())) {
ReferencesUtil.autoCreateIssueToXml(references.addElement("referenceType"), ac);
}
}
Run Code Online (Sandbox Code Playgroud)
我想为上面写一个 lambda 表达式。如果只有一个 for 循环,我可以写出 lambda 表达式,但是当有嵌套的 for 循环时就不能写了。任何帮助表示赞赏。
这是我用一个循环尝试的:
referencesDao.getRoutingCodes().stream().forEach(routingCode -> ReferencesUtil.routingCodeToXml(references.addElement("referenceType"), routingCode));
Run Code Online (Sandbox Code Playgroud) 我正在浏览 java 8 中引入的 Predicate 类,它是函数式接口。Predicate 类中有一个方法和方法,用于将多个谓词组合成一个。
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了 Java 中 PECS 的概念,但仍然无法理解为什么在 Predicate 的情况下我们使用? super T. Java 程序员如何决定它将成为消费者而不是生产者。
我的意思是为什么不允许出现编译错误的行:
public class PredicateExample {
public static void main(String[] args) {
Predicate<Number> pred = n -> n.intValue() > 2;
Predicate<Integer> predInt = n -> n > 3;
//Compile error
//pred.and(predInt);
Predicate<Object> predObj = o -> Integer.parseInt(o.toString()) > 4;
pred.and(predObj); //Valid statement
Number n = new …Run Code Online (Sandbox Code Playgroud) 在以下代码中:
ZonedDateTime zdt = ZonedDateTime.now();
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String zdtString = FORMATTER.format(zdt);
System.out.println(zdtString);
Run Code Online (Sandbox Code Playgroud)
您将看到它以 yyyy-DD-mm 格式打印出当前日期。由于这个问题是在 2021 年 7 月 17 日发布的,所以它打印了:
2021-07-17
Run Code Online (Sandbox Code Playgroud)
但是现在我想将日期更改为不同的日期(例如 1994-03-24)。
所以我试过:
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZonedDateTime zdt2 = ZonedDateTime.parse("1994-03-24", FORMATTER);
String zdtString = FORMATTER.format(zdt2);
System.out.println(zdtString);
Run Code Online (Sandbox Code Playgroud)
但后来我得到以下异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '1994-03-24' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 1994-03-24 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at javaapplication5.JavaApplication5.main(JavaApplication5.java:48)
Caused by: java.time.DateTimeException: Unable to obtain …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的简单代码
import java.util.function.Supplier;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class StreamSupplierVersusConcat {
public static void main(String[] args) {
final StreamSupplierVersusConcat clazz = new StreamSupplierVersusConcat();
clazz.doConcat();
}
private void doConcat(){
System.out.println(Stream.concat(buildStreamFromRange(0,1000).get()
,buildStreamFromRange(1000,2000).get())
.anyMatch("1"::equals));
}
private Supplier<Stream<String>>buildStreamFromRange(final int start,final int end){
return ()->IntStream.range(start, end)
.mapToObj(i->{
System.out.println("index At: "+i);
return String.valueOf(i);
});
}
}
Run Code Online (Sandbox Code Playgroud)
我知道 concat 是懒惰的,所以当我运行代码时,我看到它只生成了 2 个很棒的值,但知道 distinct 是一个有状态的操作,我认为将该方法放在 Stream 管道上它会生成所有值,然后做 anyMatch 方法,但如果我这样说
private void doConcat(){
System.out.println(Stream.concat(buildStreamFromRange(0,1000).get()
,buildStreamFromRange(1000,2000).get())
.distinct()//ARE ALL THE VALUES GENERATED NOT REQUIRED HERE???
.anyMatch("1"::equals));
}
Run Code Online (Sandbox Code Playgroud)
但是有了不同的和没有它,我得到了相同的回应。
index At: 0 …Run Code Online (Sandbox Code Playgroud)