标签: java-8

当 CSVParser 中有记录时 csvParser.getRecords() 返回空

我使用以下依赖项来读取 csv 文件:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

下面是我编写的用于读取 csv 文件的代码:

Reader reader = Files.newBufferedReader(Paths.get(file.getPath()));
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT);
for(CSVRecord csvRecord: csvParser) {
     System.out.println(csvRecord.get(0));
}
Run Code Online (Sandbox Code Playgroud)

我可以通过上述方法读取csv文件中的每一行。但是 csvParser.getRecords(); 返回空。我想要 CSV 文件中的总行数。我怎样才能做到这一点?

java csv java-8 apache-commons-csv

3
推荐指数
1
解决办法
4434
查看次数

IntelliJ Jar 错误:清单主要属性的签名文件摘要无效

我在一个系统上使用IntelliJIDE armx64 linux-based,我正在处理一个非 Maven java 项目,该项目有很多链接到它的模块(依赖项)。当从 IDE 运行我的项目时,一切正常,但是当将其构建为可运行的 jar 文件并尝试使用从终端运行该 jar 时java -jar myjar.jar,我收到以下错误:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
    at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:330)
    at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:263)
    at java.util.jar.JarVerifier.processEntry(JarVerifier.java:318)
    at java.util.jar.JarVerifier.update(JarVerifier.java:230)
    at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)
    at java.util.jar.JarFile.getInputStream(JarFile.java:450)
    at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:977)
    at sun.misc.Resource.cachedInputStream(Resource.java:77)
    at sun.misc.Resource.getByteBuffer(Resource.java:160)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:454)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at …
Run Code Online (Sandbox Code Playgroud)

java jar intellij-idea executable-jar java-8

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

Java 8 Streams - 如何将列表中具有相同字段的元素合并到一个元素并求和

我有一个问题 - 我有元素 A 列表:

class A {
String fieldA;
int fieldB
}
Run Code Online (Sandbox Code Playgroud)

我想将具有相同 fieldA 的所有元素合并到一个元素,并以这种方式汇总 fieldB 中的所有值:

el1 = AAA 5
el2 = AAA 7
el3 = AAA 2
Run Code Online (Sandbox Code Playgroud)

结果:

one element: AAA 14
Run Code Online (Sandbox Code Playgroud)

如何使用 Java 8 Streams 来做到这一点?

所以最后我的列表的元素必须比开始时少。我必须找到具有相同 fieldA 的所有元素,并将它们合并到具有求和 fieldB 的一个元素。

谢谢你!

java java-8 java-stream

3
推荐指数
1
解决办法
7311
查看次数

是否有可能(如何)在 Java 运行时获取方法引用的名称?

我最近使用了很多方法引用和 lambda,并且想知道在运行时是否可以打印以屏幕 lambda 的源(即它的名称),只是出于调试原因。我认为可以使用反射,通过在 getName() 中调用 getClass() 来实现,但我找不到用于查找原始源引用名称的方法。

我有一个功能界面,例如:

@FunctionalInterface
public interface FooInterface {
    // function etc etc irrelevant
    public void method();

    public default String getName() {
        // returns the name of the method reference which this is used to define
    }
}
Run Code Online (Sandbox Code Playgroud)

然后假设我希望测试运行该界面,并将功能界面的源代码打印到屏幕上。

public static void doStuff(FooInterface f) {
    // prints the lambda name that is used to create f
    System.out.println(f.getName());

    // runs the method itself
    f.method();
}
Run Code Online (Sandbox Code Playgroud)

所以如果我这样做:

doStuff(Foo::aMethodReference);
Run Code Online (Sandbox Code Playgroud)

它应该在屏幕上打印类似:“aMethodReference”的内容,这样我就可以知道在运行时正在运行哪些方法,以什么顺序运行等。

考虑到 lambda 不完全是对象,我很怀疑这是可能的,但是嘿,我想可能有一个解决方法。此外,eclipse调试工具只是说它是一个lambda,没有任何其他信息,lambda是否保留任何这些信息?或者在运行时全部丢失?

干杯。(如果有什么区别的话,我正在使用 JDK 11)

java reflection lambda java-8 method-reference

3
推荐指数
1
解决办法
2194
查看次数

来自 YearMonth 和第 n DayOfWeek 的 LocalDate

我想将 a 转换为具有指定的YearMontha ,例如 2019 年 2 月的第二个星期二。LocalDateDayOfWeek

以下代码抛出DateTimeException:

YearMonth yearMonth = YearMonth.of(2019, Month.FEBRUARY);
TemporalAdjuster secondTuesday = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.TUESDAY);

LocalDate date = LocalDate.from(yearMonth).with(secondTuesday);
Run Code Online (Sandbox Code Playgroud)

为了使我的代码工作,我需要将最后一行替换为

LocalDate date = yearMonth.atDay(1).with(secondTuesday);
Run Code Online (Sandbox Code Playgroud)

是否有一种不需要使用的更清洁的解决方案atDay(1)?

java time java-8 localdate

3
推荐指数
1
解决办法
5446
查看次数

使用 Java 8 将接口类型列表转换为另一个类的列表

问题:我有一个接口类型列表,在存储到数据库之前需要将其转换为数据库 DTO 列表。我是 Java 8 流和映射函数的新手,所以任何帮助都会很棒。

研究:我尝试在地图中使用instanceOf,但总是遇到编译错误。

以下是不同的类及其层次结构。

public interface Animal {}

Public Class Cat implements Animal{
    private String name;
    public void getName() {
        return name;
    }
}

Public Class Dog implements Animal{
    private String name;
    public void getName() {
        return name;
    }
}

Public Class DBAnimalDTO{
    private String dbName;
    public void setDbName(String name) {
        this.dbName = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了映射 Dog 和 Cat 类,我创建了单独的函数。

Function<Dog, DBAnimalDTO> dogFunction = dog -> {
    DBAnimalDTO dbAnimalDTO = new DBAnimalDTO();
    dbAnimalDTO.setDbName(dog.getName());
    return dbAnimalDTO; …
Run Code Online (Sandbox Code Playgroud)

java functional-programming java-8 java-stream

3
推荐指数
1
解决办法
1526
查看次数

如何使用 Hibernate 正确映射 MonetaryAmount?

当我尝试将自定义 Expenditure 对象映射到 MySQL 中的关系模型时,出现错误:

Initial SessionFactory creation failed.org.hibernate.MappingException: Could not determine type for: javax.money.MonetaryAmount, at table: Expenditure, for columns: [org.hibernate.mapping.Column(monetaryAmount)]
Run Code Online (Sandbox Code Playgroud)

我的支出类别:

@Entity
public class Expenditure implements Comparable<Expenditure> {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String description;

    private MonetaryAmount monetaryAmount;

    private LocalDate date;

    private ExpenditureType type;

    @OneToOne
    private User client;
...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下如何进行映射?

java spring jpa java-8 spring-data-jpa

3
推荐指数
1
解决办法
2007
查看次数

实现与多个 EJB 的接口

给出以下接口:

public interface MyRunnable {   
    public MyResponse run(int x);
}
Run Code Online (Sandbox Code Playgroud)

它由两个 bean 实现@Stateless:

@Stateless
public class Bean1 implements MyRunnable {

     public MyResponse run(int x) {
           // some logic
     }
}


@Stateless
public class Bean2 implements MyRunnable {

     public MyResponse run(int x) {
           // some logic
     }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想根据条件运行一个或另一个 bean。实现这一目标的最佳方法是什么?

这是我尝试过的,但没有成功:

@Stateless
@LocalBean
public class MainBean {

   @Inject 
   private Bean1 bean1;

   @Inject 
   private Bean2 bean2;

   public void someMethod(int y) {

          MyRunnable runnable = null;
          if (y == 1)
              runnable …
Run Code Online (Sandbox Code Playgroud)

java ejb java-8 jakarta-ee

3
推荐指数
1
解决办法
568
查看次数

如何有效地比较同一类的两个对象并检查哪些字段不同?

我想编写一个通用函数,它接受同一实体类的两个对象并比较不同的字段,并返回随时间对特定字段所做的所有更改的列表。

许多实体类之一是 Member,如下所示

public class Member {
    String firstName;
    String lastName;
    String driverLicenseNumber;
    Integer age;
    LocalDateTime timestamp;
}
Run Code Online (Sandbox Code Playgroud)

在数据库中,我有一个名为 member_audit 的表,每当使用触发器在成员表中发生更改时,该表都会填充旧数据(对于其他实体也类似)。

我要返回的每个实体的资源列表类似于

public class MemberAuditsResource {
    private String field;
    private LocalDateTime on;
    private String changeType;
    private String oldValue;
    private String newValue;
}
Run Code Online (Sandbox Code Playgroud)

我只能想到像这样为每个实体分别编写一个函数

private List<MembeAuditsResource> memberCompare(Member obj1, Member obj2) {

    //Compare every field in both the objects using if else and populate the resource.

}
Run Code Online (Sandbox Code Playgroud)

然后调用上面的函数来比较entity_audit表中的每对记录。代码将非常大,无法比较每个字段并乘以不同的实体。有没有更好、更有效的方法呢?

java spring java-8 spring-boot

3
推荐指数
1
解决办法
5095
查看次数

从内部列表java 8的对象列表中获取id列表

我有实体类列表:

public class Entity
{
    private long id;    
    private List<InnerEnity> data;

    public long getId() {
        return id;
    }

    public List<InnerEnity> getData() {
        return data;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 InnerEnity 类

public class InnerEnity 
{
    private long id;    
    private String data;

    public long getId() {
        return id;
    }

    public String getData() {
        return data;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要的是 InnerEnity id 列表。为了解决这个问题,我正在尝试类似的事情:-

List innerEnityIds = listOfEnity.stream().map(sys -> sys.getData().stream().map(obj->obj.getId().collect(Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

java collections java-8 java-stream

3
推荐指数
1
解决办法
7301
查看次数