我想在应该支持Java 8的最新Apache-Karaf版本(3.0.2)中使用Java 8功能。
我的域层(存储库)中有一个服务接口,该接口具有用于生成身份的默认方法
public interface MyRepository{
...
default MyId nextIdentity() {
return new MyId(UUID.randomUUID().toString().toUpperCase());
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我有了该接口的实现,该接口使用Blueprint(Apache-Aries)作为OSGi-Service公开。
当我运行我的应用程序时,捆绑包安装成功,服务被注册,但是当应用程序层调用nextIdentity方法时,我得到一个异常。
IncompatibleClassChangeError: Found interface MyRepository, but class was expected
Run Code Online (Sandbox Code Playgroud)
应用层很简单:Interface-Attribute通过Blueprint注入其类(在本例中为OSGi-Service-Reference)。
我确实检查了编译:所有模块都在Eclipse中使用Java 8符合性级别进行了编译。我猜测问题与不是Java 8的aries-proxy有关,但由于karaf支持。
编辑:添加了Stacktrace
org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor 'public bikeshop.http.wicket.page.GaragePage()'. Might be it doesn't exist, may be it is not visible (public).
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:193)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:66)[92:org.apache.wicket.core:6.7.0]
at org.ops4j.pax.wicket.internal.PaxWicketPageFactory.newPage(PaxWicketPageFactory.java:76)[100:org.ops4j.pax.wicket.service:3.0.2]
at org.apache.wicket.DefaultMapperContext.newPageInstance(DefaultMapperContext.java:133)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.core.request.handler.PageProvider.resolvePageInstance(PageProvider.java:268)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.core.request.handler.PageProvider.getPageInstance(PageProvider.java:166)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.request.handler.render.PageRenderer.getPage(PageRenderer.java:78)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:244)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:165)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:854)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)[91:org.apache.wicket.request:6.7.0]
at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:254)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:211)[92:org.apache.wicket.core:6.7.0]
at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:282)[92:org.apache.wicket.core:6.7.0] …Run Code Online (Sandbox Code Playgroud) 这是我的Test样子:
@Test
public void testFunctional()
{
final Member member = new Member("email", "memberExternalId", "clientId", "clientSecret");
final Category foodCategory = new Category("Groceries", "Food");
final Category utilityCategory = new Category("Internet", "utility");
final List<Transaction> transactions = new ArrayList<>();
{
transactions.add(new Transaction("food1", new BigDecimal("10.00"), true, LocalDateTime.now(), member, foodCategory));
transactions.add(new Transaction("food2", new BigDecimal("20.00"), true, LocalDateTime.now(), member, foodCategory));
}
{
transactions.add(new Transaction("utility1", new BigDecimal("100.00"), true, LocalDateTime.now(), member, utilityCategory));
transactions.add(new Transaction("utility2", new BigDecimal("200.00"), true, LocalDateTime.now(), member, utilityCategory));
}
final Map<String, List<BigDecimal>> groupByCategory = transactions.stream().collect(Collectors.groupingBy(Category::getGroupName));
} …Run Code Online (Sandbox Code Playgroud) 我是Java 8的新手,我正在研究流并遇到一个我无法解决的问题:
int[] intArr = new {1,2,4,6,7,8};
Run Code Online (Sandbox Code Playgroud)
我想使用Stream来获取数组中奇数位置的项目.
预期结果 : [1,4,7]
并使用Stream生成一个新的数组,该数组由以下形式组成: {intArr[i] + intArr[i+1]}
预期结果: [3,6,10,13,15]
第一次使用Java 8和我遇到了这个bug.有没有遇到过这个?Bug被标记为已解决但是我不知道为什么我会得到它.我也在bug中找到了列出的示例代码并且确实获得了UOE.这是我的环境:
VM x64中的操作系统
$ cat /etc/lsb-release
DISTRIB_ID="elementary OS"
DISTRIB_RELEASE=0.2.1
DISTRIB_CODENAME=luna
DISTRIB_DESCRIPTION="elementary OS Luna"
Run Code Online (Sandbox Code Playgroud)
JDK
$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
$ javac -version
javac 1.8.0_25
Run Code Online (Sandbox Code Playgroud)
这是我的考试
package test;
import org.junit.Test;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
public class RemoveIfTest {
static interface I {
// i want to remove this
public void a();
public String b();
}
@Test(expected = UnsupportedOperationException.class)
public void …Run Code Online (Sandbox Code Playgroud) 我必须在testFile.xml中搜索每个单词"abc"+ 7个不重要的数字+"myOldWord"来更改为一些新内容而不用担心里面的数字.会有几个"xxx9999999myOldWorld".如何找到"abc1234567myOldWorld"并使用正则表达式替换newWorld的myOldWorld?我不仅可以从myOldWorld交换到newWord,因为必须在搜索条件中使用前三个字符,必须忽略它们之间的未知7长度.
其他例子.让我们说我有新的世界"aaaOtherNewWord"来取代"aaa9999999OtherOldWord"(我不知道搜索时的数字,并且有几个不同的数字).假设testFile.xml中有三个旧单词:aaa1234567OTHEROLDWORD,aaa9876543otheroldword和bbb9876543otheroldword,我想执行replaceAll并得到结果:aaa1234567OtherNewWord和aaa9876543OtherNewWord尊重但是bbb9876543otheroldword不会改变,因为前3位数字与搜索条件不匹配.
我在下面编码成功,我在搜索时忽略了这个案例,但我必须忽略这些数字,我不知道如何用正则表达式做到这一点.
Path path = Paths.get("C:\\testFolder\\testFile.xml");
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("(?i)" + oldWord, newWord);
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是Java 8.
整个测试是:
// C:\ test.xml
<?xml version="1.0" encoding="UTF-8"?>
<c:bps xmlns:c="CertainApp">
<c:bp name="ProductPortfolio" id="myProdPort">
<!-- must result in ABC1234567MyCompanyWORDProductSubproduct-->
<c:message type="ABC1234567MyCompanyWorDProductSubproduct" />
<!-- must result in ABC0987654MyCompanyWORDProductSubproduct-->
<c:message type="ABC0987654MyCompanyWoRdProductSubproduct" />
<!-- must result in XYZ1234567MyCompanywordproductSubproduct-->
<c:message type="XYZ1234567MyCompanywOrdproductSubproduct" />
<!-- nothing changed in next two-->
<c:message type="XYZ1234567MyCompanyAnyThingproductSubproduct" />
<c:message type="XYZ0987654MyCompanyAnyThingproductSubproduct" />
</c:bps>
Run Code Online (Sandbox Code Playgroud)
// C:\ defaults_test包含两个文件
ABCMyCompanyWORDproductSubproduct.xml //here …Run Code Online (Sandbox Code Playgroud) 我创建了两个Stream
Stream<String> first= ...
Stream<String> second= ...
Run Code Online (Sandbox Code Playgroud)
他们俩都有数字.假设第一个文件有1到1000而第二个文件有25到35.我想检查第一个文件是否包含秒数的数字.
first.filter(s-> !s.contains(second.toString())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如果我second.toString()用"10" 替换它然后它可以工作,但我如何检查整个流而不仅仅是字符串或字符串?
我们可以像这样从字符串List创建流
List<String> list = Arrays.asList("somestring");
Stream<String> stream = list.stream();
Run Code Online (Sandbox Code Playgroud)
但是如何直接从字符串创建流.
String x = "somestring";
Run Code Online (Sandbox Code Playgroud) 我上课了
public class Targets {
public int[] miniTargets;
public Targets(int t) {
miniTargets = new int[t];
for (int i = 0; i < t; i++) {
miniTargets[i] = t;
}
}
}
Run Code Online (Sandbox Code Playgroud)
而且我想要计算miniTargets我Targets收藏的数量,但我坚持flatMap:
public class App {
public static void main(String[] args) {
List<Targets> lst = new ArrayList<Targets>();
lst.add(new Targets(5));
lst.add(new Targets(15));
lst.add(new Targets(25));
int cnt = (int)lst.stream().map(tg -> tg.miniTargets).flatMap(...).count()
System.out.println(cnt);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读Java 8中的新的java.time API
像这样的东西
public final class DaysWithBaby
{
private final LocalDate sheSayYes = LocalDate.of(2008,Month.APRIL,26);
private final LocalDate today = LocalDate.now().plusDays(1);
public static void main(String[] args)
{
final DaysWithBaby clazz = new DaysWithBaby();
System.out.println(Period.between(clazz.sheSayYes,clazz.today).getDays());
System.out.println(ChronoUnit.DAYS.between(clazz.sheSayYes,clazz.today));
}
}
Run Code Online (Sandbox Code Playgroud)
两个输出都列在下面.
1
2467
Run Code Online (Sandbox Code Playgroud)
我认为这个结果是正确的
System.out.println(ChronoUnit.DAYS.between(clazz.sheSayYes,clazz.today));
Run Code Online (Sandbox Code Playgroud)
但是这个结果又回来了 1
System.out.println(Period.between(clazz.sheSayYes,clazz.today).getDays());
Run Code Online (Sandbox Code Playgroud)
我做错了什么任何帮助都非常感激.
我有一个可为空List的BufferedImage秒.
List<BufferedImage> list = null; // or not null.
Run Code Online (Sandbox Code Playgroud)
我发现我可以像这样刷新列表中的每个图像.
Optional.ofNullable(list)
.ifPresent(l -> l.forEach(i -> i.flush())); // ok
Run Code Online (Sandbox Code Playgroud)
我可以做到这一点.
Optional.ofNullable(list)
.ifPresent(l -> l.forEach(BufferedImage::flush)); // ok
Run Code Online (Sandbox Code Playgroud)
为什么编译器在我尝试这样做时会抱怨?
Optional.ofNullable(list)
.ifPresent(List::forEach(BufferedImage::flush)); // not ok
Run Code Online (Sandbox Code Playgroud) java-8 ×10
java ×8
java-stream ×4
lambda ×2
apache-karaf ×1
date ×1
osgi ×1
regex ×1
string ×1