标签: java-8

如何使用 Java 8 迭代 Map 以获得重复字符键的字符串

我有一个Map如下所示:

Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
    map.put('c', 5);
    map.put('f', 2);
    map.put('r', 1);
    map.put('D', 3);
Run Code Online (Sandbox Code Playgroud)

我需要获得输出:

cccccffrDDD
Run Code Online (Sandbox Code Playgroud)

我可以在正常过程中做到这一点,但我想在 Java 8 中做到这一点。你能分享一些如何实现这一点的提示吗?

java string hashmap java-8 java-stream

2
推荐指数
2
解决办法
1296
查看次数

Java 泛型:特定参数类型的静态方法与功能接口不匹配

下面的第一个作业无法编译,但我不确定为什么,静态方法的方法签名与函数方法签名匹配,尽管它不使用类型参数。尽管第二行除了类型参数化之外具有相同的签名,但编译良好。

这背后的原因是什么?

public class GenericSample<T> {
    public static void staticLambdaMtd(Integer a) {
            
    }   

    public static<X> void staticLambdaMtd2(X a) {
            
    }  

    // Funca<T> fa1 = GenericSample::staticLambdaMtd;//does not compile !

    Funca<T> fa = GenericSample::staticLambdaMtd2;//does compile !      
}
    
interface Funca<A> {
    public void funct(A a);
}
Run Code Online (Sandbox Code Playgroud)

java generics covariance java-8 method-reference

2
推荐指数
1
解决办法
154
查看次数

Java 流:限制不适用于 Random().ints().sorted()

我有以下代码:

new Random().ints()
            .map(i -> i / 2)
            .limit(100)
            .toArray()
Run Code Online (Sandbox Code Playgroud)

...并且它按预期工作。

但这不起作用:

new Random().ints()
            .sorted()
            .map(i -> i / 2)
            .limit(100)
            .toArray()
Run Code Online (Sandbox Code Playgroud)

它抛出:

Exception in thread "main" java.lang.IllegalArgumentException: Stream size exceeds max array size
Run Code Online (Sandbox Code Playgroud)

limit 不应该使流短路并帮助将其限制为 100 个元素吗?

java java-8 java-stream

2
推荐指数
1
解决办法
120
查看次数

如何使用partitioningBy,然后使用Java Streams分别对结果列表进行排序

我有一个如下所示的对象:

public class Resource {
  int level;
  String identifier;
  boolean isEducational;

  public Resource(String level, String identifier, boolean isEducational) {
            this.level = level;
            this.identifier = identifier;
            this.isEducational = isEducational;
        }

 // getter and setters 
}
Run Code Online (Sandbox Code Playgroud)

这些资源的列表如下:

List<Resource> resources = Arrays.asList(new Resource(4, "a", true ),
                                                new Resource(4, "b", false),
                                                new Resource(3, "c", true ),
                                                new Resource(3, "d", false ),
                                                new Resource(2, "e", true ),
                                                new Resource(2, "f" , false));
Run Code Online (Sandbox Code Playgroud)

我想按其属性对这个列表进行排序,但是这种排序应该针对资源和资源level分别进行。isEducationalisEducational

因此,排序后,结果列表应按以下顺序排列:

[Resource e, Resource c, Resource …
Run Code Online (Sandbox Code Playgroud)

java sorting java-8 collectors

2
推荐指数
1
解决办法
159
查看次数

Java Stream:类 com.java8.Student 无法转换为类 java.lang.Comparable

Student使用 java 8 的自然排序方法迭代所有数据sorted()。迭代学生数据时,在 IDE 控制台中出现异常class com.java8.Student cannot be cast to class java.lang.Comparable。我的StreamStudent.java文件在com.java8包内。

这是我的完整堆栈跟踪:

Exception in thread "main" java.lang.ClassCastException: class com.java8.Student cannot be cast to class java.lang.Comparable (com.java8.Student is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
    at java.base/java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:47)
    at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.base/java.util.TimSort.sort(TimSort.java:220)
    at java.base/java.util.Arrays.sort(Arrays.java:1307)
    at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:353)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at com.java8.StreamStudent.main(StreamStudent.java:72)
Run Code Online (Sandbox Code Playgroud)

下面是我的代码:

package com.java8;

import java.util.*; …
Run Code Online (Sandbox Code Playgroud)

java comparable java-8 java-stream

2
推荐指数
1
解决办法
6205
查看次数

Java 8:根据 ISO 8601 使用区域偏移格式化 Instant

Instant我正在尝试根据本文中的参考从对象创建 ISO 8601 格式的 DateTime,我使用该格式YYYY-MM-DD'T'hh:mm:ss'T'ZD来解析即时日期,如下所示。

但它生成的时间格式错误:

2022-06-172T06:08:13T-0500172
Run Code Online (Sandbox Code Playgroud)

预期的格式应该是:

2022-06-21T13:31:49-05:00
Run Code Online (Sandbox Code Playgroud)

我的代码:

DateTimeFormatter formatter = DateTimeFormatter
            .ofPattern("YYYY-MM-DD'T'hh:mm:ss'T'ZD")
            .withZone(ZoneId.systemDefault());

formatter.format(Instant.now())
Run Code Online (Sandbox Code Playgroud)

如何生成如下所示的格式化时间?

2022-06-21T13:31:49-05:00
Run Code Online (Sandbox Code Playgroud)

java datetime datetime-format java-8 java-time

2
推荐指数
1
解决办法
1万
查看次数

我不明白下面给出的代码的逻辑

我已在编译器中运行此代码并得到输出 1,但我不明白它将如何成为 1。请用答案解释。

public class Main {
    public static void main(String args[]) {
        int a = 10;
        int b = 2;
        System.out.println((a < b) ? a++ : --b);
    }
}
Run Code Online (Sandbox Code Playgroud)

java java-8

2
推荐指数
1
解决办法
106
查看次数

JDK8中可以只用一个流表达式来得到两个条件的结果吗?

这是我的代码,但我发现它不好。在JDK8中我可以只使用一个流表达式来获得两个条件的结果吗?我想确保id条件是第一个,名称条件是第二个。

  public Student getStudent(String id,String name)  {
    try {
        List<Student> students = studentDao.getStudent();
        if (CollectionUtils.isNotEmpty(students)) {
            Student studentDomain=students.stream()
                    .filter(p -> id .equals(p.getId()))
                    .findAny().orElse(null);
            if(studentDomain==null){
                studentDomain=students.stream()
                        .filter(p -> name.equals(p.getName()))
                        .findAny()
                        .orElse(null);
            }
            return studentDomain;
        } else {
            return null;
        }
    }catch (Exception ex){ 
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

2
推荐指数
1
解决办法
425
查看次数

从 Iterable 创建 ImmutableList

我需要从 an 中的每个元素获取一个对象Iterable并将其添加到List.

我可以使用下面的代码来做到这一点。ImmutableList但是,有没有什么方法可以在不显式实例化的情况下创建 Guava List

List<Data> myList = new ArrayList<>();
myIterable.forEach(val ->
  myList.add(val.getMetaData())
);
Run Code Online (Sandbox Code Playgroud)

java guava java-8

2
推荐指数
1
解决办法
783
查看次数

创建模拟库

我想创建一个模拟库类来实现InvocationHandlerJava Reflection 的接口。

这是我创建的模板:

import java.lang.reflect.*;
import java.util.*;

class MyMock implements InvocationHandler {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // todo
        }
        
        public MyMock when(String method, Object[] args) {
            // todo
        }
        
        public void thenReturn(Object val) {
            // todo
        }
}
Run Code Online (Sandbox Code Playgroud)

when 和 thenReturn 方法是链式方法。

然后when方法注册给定的模拟参数。

thenReturn方法注册给定模拟参数的预期返回值。

另外,如果代理接口调用方法或使用未注册的参数,我想抛出 java.lang.IllegalArgumentException 。

这是一个示例界面:

interface CalcInterface {
    int add(int a, int b);
    String add(String a, String b);
    String getValue();
}
Run Code Online (Sandbox Code Playgroud)

这里我们有两个重载add …

java reflection interface mocking java-8

2
推荐指数
1
解决办法
329
查看次数