我已经阅读了Oracle的表达式教程,无法理解这一点.
众所周知,以下代码行是有效的Java语法:
new Object();
Run Code Online (Sandbox Code Playgroud)
但是,当我用原始表达式尝试这个时:
(3 + 2);
Run Code Online (Sandbox Code Playgroud)
Eclipse显示编译错误"赋值的左侧必须是变量".
这不仅适用于原语,也适用于String文字:
"arbitraryString";
Run Code Online (Sandbox Code Playgroud)
那么,未分配的表达式作为Java代码行有效的规则是什么?
我知道Java"..."数组参数语法可以作为参数接收数组,或只传递给方法的许多参数.但是,我注意到它也适用于Collections:
public static void main(String[] args) {
Collection<Object> objects = new ArrayList<>();
test(objects);
}
public static void test (Object...objects) {
System.out.println("no compile errors");
}
Run Code Online (Sandbox Code Playgroud)
这编译并运行,我无需调用该toArray()
方法.现场背后发生了什么?此语法是否有其他"自动转换"方法?
顺便说一下,我正在使用Java 1.7.
我使用Spring Boot作为MVC应用程序,我的视图技术是Thymeleaf.我需要做的一件事就是复制现有网站的HTML(而不是我做的......)并使用Thymeleaf渲染它.然而,一些网站的HTML源代码的包含未闭合的HTML标签(例如<meta>
,<link>
,<input>
),或者未用引号括起来的元素,例如HTML标签:
<div id=1></div>
Run Code Online (Sandbox Code Playgroud)
代替
<div id="1"></div>
Run Code Online (Sandbox Code Playgroud)
当然在浏览器中这可以工作......但是Thymeleaf不允许这样做,也不会为页面提供服务.有没有办法让这个更宽松的规则?我搜索了Thymeleaf的文档和Spring Boot参考,但没有找到答案.
只是为了澄清 - 我甚至没有为Thyemeleaf配置我自己的bean,只是通过maven作为spring-boot-starters之一将它添加到类路径中.所以现在这些都是默认设置.
假设我有一个实体列表:
List<SomeEntity> myEntities = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
SomeEntity.java:
@Entity
@Table(name = "entity_table")
public class SomeEntity{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private int score;
public SomeEntity() {}
public SomeEntity(long id, int score) {
this.id = id;
this.score = score;
}
Run Code Online (Sandbox Code Playgroud)
MyEntityRepository.java:
@Repository
public interface MyEntityRepository extends JpaRepository<SomeEntity, Long> {
List<SomeEntity> findAllByScoreGreaterThan(int Score);
}
Run Code Online (Sandbox Code Playgroud)
所以当我运行时:
myEntityRepository.findAllByScoreGreaterThan(10);
Run Code Online (Sandbox Code Playgroud)
然后 Hibernate 会将表中的所有记录加载到我的内存中。有数百万条记录,所以我不想那样做。然后,为了相交,我需要将结果集中的每条记录与我的列表进行比较。在本机 MySQL 中,我在这种情况下会做的是:
通过这种方式,我获得了很大的性能提升,避免了任何 OutOfMemoryErrors 并让数据库机器完成大部分工作。
有没有办法使用 Spring Data JPA 的查询方法(使用 hibernate 作为 JPA 提供程序)来实现这样的结果?我在文档或 SO 中找不到任何此类用例。
在 Intellij 中用 Java(和 Kotlin!)编码时,我通常从它们被分配的表达式中提取变量/字段。换句话说,如果我想在 Kotlin 中编写以下代码:
val 名称 = getMyString()
然后我会写getMyString
,突出显示它并使用键盘快捷键提取变量。好看又简单。
但是假设我希望明确显示值类型,意思是:
val 名称:String = getMyString()
如果我使用变量提取,IntelliJ 会为我提供一个复选框,我必须用鼠标点击它,它会显示类型。另一个烦人的选择是设置变量名称,然后使用 Alt + Enter 显式显示类型。
与之前的问题(或 JetBrains 文档)不同,我不希望默认显示类型。我只是想知道是否有键盘快捷键可以检查上述复选框,而不会中断编写代码的流程。
让我们举一个简单的Spring Boot程序的例子:
Application.java
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class);
}
}
Run Code Online (Sandbox Code Playgroud)
SuperClass.java
public abstract class SuperClass {
@Scheduled(fixedRate = 5000)
public void printSomething() {
System.out.println("this is the super method");
}
}
Run Code Online (Sandbox Code Playgroud)
SubClass.java
@Component
public class SubClass extends SuperClass {
}
Run Code Online (Sandbox Code Playgroud)
根据这个答案,只有注释的注释由@Inherited
子类继承,而@Scheduled没有这样的注释.那怎么会有效呢?
我知道当弹出组件弹出时,Spring Boot在加载上下文时遇到问题.我在这里读到了如何成功加载上下文.但是,集成测试怎么样?
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
public class DemoApplicationTests {
@Test
public void contextLoads() {
}
}
Run Code Online (Sandbox Code Playgroud)
public static void main(String[] args) {
try(ConfigurableApplicationContext context = new SpringApplicationBuilder
(DesktopAppConfig.class)
.headless(false).run(args)) {
}
Run Code Online (Sandbox Code Playgroud)
@Configuration
public class DesktopAppConfig {
@Bean
public Object someBean() {
JOptionPane.showMessageDialog(null, "message");
return new Object();
}
}
Run Code Online (Sandbox Code Playgroud)
这个简单的集成测试会抛出一个java.awt.HeadlessException,我无法在Spring Boot引用中找到任何通过集成测试将上下文设置为无头的方法.
是否有一种方法,不解决传统的类似Java的for循环,限制BufferedReader读取的行数?
以此代码为例:
bufferedReader.useLines { it }
.take(10)
.toList()
Run Code Online (Sandbox Code Playgroud)
useLines
各州的文件:
调用[block]回调,为它提供此文件中所有行的序列,并在处理完成后关闭阅读器一次.
根据我的理解,这意味着将读取整个文件,然后才会从序列中过滤掉前十个文件.除了只获取第一行之外,我无法在网上找到解决此问题的任何内容.
java ×6
spring ×3
kotlin ×2
spring-boot ×2
hibernate ×1
html ×1
jpa ×1
spring-data ×1
spring-mvc ×1
thymeleaf ×1