这是关于API设计的问题.在C#中添加扩展方法时,获取IEnumerable所有在所有集合上直接使用lambda表达式的方法.
随着Java中lambdas和默认方法的出现,我希望Collection能够实现Stream并为其所有方法提供默认实现.这样,我们就不需要调用stream()它来利用它提供的功率.
图书馆建筑师选择不太方便的方法的原因是什么?
这是第一次发生类似的事情发生在我身上.在某些时候,Intellij停止显示.java文件.它仍然显示包结构.但那里没有.java文件.如果我尝试从资源管理器中拖动文件,它会打开它并显示以下消息:
// IntelliJ API从类文件生成的反编译器存根源实现方法不可用
当我尝试导航到类或文件(Ctrl + N,Ctrl + Shft + N)时,没有任何内容弹出.当然,文件在那里.我尝试重新启动intellij,重新启动计算机,重新打开项目(使用POM,如果重要的话).并在桌子周围跑几圈.什么都没有帮助.
感谢有关如何解决此问题的一些意见.似乎无法在网上找到类似的东西..
项目窗格如下所示(产品名称被混淆):

直到Java 8,表示元素集合的属性通常返回Collection.在缺少不可变的集合接口时,常见的习惯用法是将其包装为:
Collection<Foo> getFoos(){ return Collections.unmodifiableCollection(foos); }
Run Code Online (Sandbox Code Playgroud)
现在Stream就在这里,很有可能开始暴露Streams而不是Collections.
我看到的好处是:
另一方面,Streams只能使用一次,并且不能像常规集合那样传递.这尤其令人担忧.
这个问题与类似的问题有所不同,因为它更广泛,因为OP明确表示他打算返回的流不会被传递.在我看来,这个方面没有在原始问题的答案中得到解决.
换句话说:在我看来,如果API返回一个流,那么一般的思维方式应该是与它的所有交互必须在直接上下文中终止.应该禁止传递流.
但是,除非开发人员非常熟悉Stream API,否则似乎很难执行.这意味着这种API需要范式转换.我对这个断言是对的吗?
我有一个非常大的项目,开发人员在某个时候开始注意到,如果他们尝试在 intellij 中运行/调试 PowerMock 驱动的测试 - 他们会收到以下错误:
java.lang.NoClassDefFoundError: org/powermock/core/transformers/impl/MainMockTransformer
FATAL ERROR in native method: processing of -javaagent failed
at org.powermock.modules.agent.PowerMockClassTransformer.<clinit>(PowerMockClassTransformer.java:41)
at org.powermock.modules.agent.PowerMockAgent.<clinit>(PowerMockAgent.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.ClassNotFoundException: org.powermock.core.transformers.impl.MainMockTransformer
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 8 more
Run Code Online (Sandbox Code Playgroud)
我们正在使用 powermockagent,单元测试通常如下所示:
@PrepareForTest({Bla.class})
public class BlaTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
static {
PowerMockAgent.initializeIfNeeded();
}
@Test public void test() { ... }
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我禁用dynamic.path,问题就会消失,但我认为这是一种解决方法,而不是解决方案,因为我在其他情况下需要 dynamic.path。 …
Kibana 是否支持按 OOB 相似性对日志消息进行分组?
鉴于我知道其中包含变量的特定日志消息,我可以使用 grok 查询。问题是我想要一组未指定数量的消息“种类”。
所以对于一个看起来像这样的日志:
[error] entity foo with id 2 is misisng
[error] cant process row with id 46
[error] entity frob with id 16 is misisng
[error] cant process row with id 95
Run Code Online (Sandbox Code Playgroud)
我希望输出生成两组,一组用于缺少 id 的“种类”实体,另一组用于“种类”无法处理带有 id 的行。
我正在使用 Kibana 5.1.1
这段代码运行得很好:
from azure.storage.blob import BlobServiceClient
from azure.identity import InteractiveBrowserCredential, DeviceCodeCredential, ClientSecretCredential
credential = DeviceCodeCredential(authority="login.microsoftonline.com", tenant_id="***", client_id="***")
blobber = BlobServiceClient(account_url="https://***.blob.core.windows.net", credential=credential)
blobs = blobber.list_containers()
for b in blobs:
print(b)
Run Code Online (Sandbox Code Playgroud)
我运行它,浏览到 URL,填写我发出的代码,随后连接成功并返回容器列表。
但是,当我尝试切换到 InteractiveBrowserCredential 时:
credential = InteractiveBrowserCredential(authority="login.microsoftonline.com", tenant_id="***", client_id="***")
blobber = BlobServiceClient(account_url="https://***.blob.core.windows.net", credential=credential)
blobs = blobber.list_containers()
for b in blobs:
print(b)
Run Code Online (Sandbox Code Playgroud)
浏览器确实打开,我获得了令牌,但身份验证失败并出现以下错误:
azure.core.exceptions.ClientAuthenticationError: Authentication failed: AADSTS7000218: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.
Run Code Online (Sandbox Code Playgroud)
网上看类似的问题,根本原因通常是应用程序没有在Azure AD中注册为PublicClient。然而,这里的情况并非如此。我确保该应用程序已注册为公共客户端。事实上,第一个样本就完美地证明了这一点。
我在这里敲头。还有其他建议吗?
Java 7 引入了一个很棒的 API 来编写自定义文件系统。考虑一个用例,我不想实现一个新的文件系统,我只想调整现有文件系统的行为。例如,翻转从它写入/读取的每一位。
在我看来,当前的 jdk 没有为此提供适当的设施。AbstractFileSystemProvider,WindowsFileSystemProvider 扩展的提供程序是包私有的,所以我不能重用它。我什至没有找到 Linux 的具体实现。
问题#1:当前文件系统没有用于扩展的有用抽象。
假设我只为 Windows 扩展。WindowsFileSystemProvider 是公开的,所以我实际上可以轻松地覆盖 newByteChannel 并完成它。可惜!
问题#2:WindowsFileSystem不是公开的,所以我实际上必须编写一个全新的 FileSystem 来引入一个新的 Provider。
我是不是遗漏了什么,或者这个功能是完全原始的,还没有准备好供应用程序编写者使用?
我有一个处理集合的 API。这个API的执行时间与集合大小有关(集合越大,占用的时间越多)。
我正在研究如何使用 prometheus 执行此操作,但不确定我是否正确地做事(这方面的文档有点缺乏)。
我做的第一件事是定义一个摘要指标来衡量 API 的执行时间。我正在使用规范的 rate(sum)/rate(count) 解释here。
现在,由于我知道延迟可能受输入大小的影响,我还想在平均执行时间上叠加请求大小。由于我不想测量每个可能的尺寸,我想我会使用直方图。像这样:
Histogram histogram = Histogram.build().buckets(10, 30, 50)
.name("BULK_REQUEST_SIZE")
.help("histogram of bulk sizes to correlate with duration")
.labelNames("method", "entity")
.register();
Run Code Online (Sandbox Code Playgroud)
注意:术语“大小”与字节大小无关,而是与需要处理的集合的长度有关。2 件、5 件、50 件……
在执行中我做(简化):
@PUT
void process(Collection<Entity> entitiesToProcess, string entityName){
Timer t = summary.labels("PUT_BULK", entityName).startTimer()
// process...
t.observeDuration();
histogram.labels("PUT_BULK", entityName).observe(entitiesToProcess.size())
}
Run Code Online (Sandbox Code Playgroud)
题:
在转换导致创建或加载昂贵资源的情况下(例如,对外部服务进行身份验证或创建数据库连接),在映射分区上使用映射可以显着提高性能。
mapPartition允许我们每个分区初始化一次昂贵的资源,而不是像标准map那样每行初始化一次。
但是如果我使用数据帧,我应用自定义转换的方式是通过指定用户定义的函数逐行操作 - 所以我失去了使用 mapPartitions 为每个块执行一次繁重工作的能力。
在 spark-sql/dataframe 中是否有解决方法?
更具体地说:
我需要对一堆文档执行特征提取。我有一个输入文档并输出一个向量的函数。
计算本身涉及初始化与外部服务的连接。我不想或不需要为每个文档初始化它。这在规模上具有非平凡的开销。
java ×4
api-design ×3
java-8 ×3
java-stream ×2
lambda ×2
apache-spark ×1
azure ×1
filesystems ×1
io ×1
java-7 ×1
kibana ×1
kibana-5 ×1
logging ×1
maven ×1
monitoring ×1
optimization ×1
performance ×1
powermock ×1
prometheus ×1
pyspark ×1
python-3.x ×1
unit-testing ×1