我经常想将一个列表映射到另一个列表.例如,如果我有一个人员列表,我想要一个他们的名字列表,我想这样做:
目标
List<Person> people = ... ;
List<String> names = people.map(x -> x.getName());
Run Code Online (Sandbox Code Playgroud)
使用Java 8可以实现这样的功能:
JAVA 8版
List<String> names = people.stream()
.map(x -> x.getName())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但这显然不是那么好.事实上,我认为使用番石榴更清洁:
GUAVA版本
List<String> names = Lists.transform(people, x -> x.getName());
Run Code Online (Sandbox Code Playgroud)
但是,我喜欢链接.那么,我的目标是否可行?
我听说有人说Java 8默认方法类似于C#扩展方法.使用C#扩展方法,我可以轻松地将辅助方法添加到IEnumerable<T>:
public static IEnumerable<TRet> Map<T, TRet>(this IEnumerable<T> list, Func<T, TRet> selector)
{
return list.Select(selector);
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何使用默认方法来扩展现有接口.
此外,这显然是一个微不足道的例子.通常,我希望能够扩展List<T>和Iterable<T>接口,以便更容易地与流api进行交互.
我有一个Jersey REST API并使用a ContainerRequestFilter来处理授权.我也在@ManagedAsync所有端点上使用,以便我的API可以服务数千个并发请求.
我的授权过滤器命中远程服务,但是当运行过滤器时,Jersey还没有将当前线程添加到它的内部ExecutorService,所以我完全失去了异步的好处.
我可以告诉泽西岛我希望这ContainerRequestFilter是异步的吗?
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter
{
@Inject
private AuthorizationService authSvc;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException
{
String authToken = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
// HITS A REMOTE SERVER
AuthorizationResponse authResponse = authSvc.authorize(authToken);
if (!authResponse.isAuthorized())
{
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED)
.entity("unauthorized!")
.build());
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例资源:
@Path("/stuff")
@Produces(MediaType.APPLICATION_JSON)
public class StuffResource
{
@GET
@Path("/{id}")
@ManagedAsync
public void getById(@PathParam("id") long id, @Suspended final AsyncResponse ar)
{
Stuff s;
// HIT THE DATABASE …Run Code Online (Sandbox Code Playgroud) 如何使用sentry raven-java客户端设置用户上下文?
我已经尝试添加user_email标签,并添加user_email到MDC.它们都按预期工作,标签转到标签,MDC转到其他数据,但都没有设置哨兵用户上下文.
我也使用javascript的哨兵,使用raven-js,这很好用:
Raven.setUserContext({
email: '',
id: ''
});
Run Code Online (Sandbox Code Playgroud)
是否有Java等价物?
我试图让LogBack DBAppender从编程配置中运行,但似乎无法让它运行起来.
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
DBAppender dbAppender = new DBAppender();
dbAppender.setContext(lc);
DriverManagerConnectionSource connectionSource = new DriverManagerConnectionSource();
connectionSource.setDriverClass("com.mysql.jdbc.Driver");
connectionSource.setUrl(loggingConnectionInfo.getUri());
connectionSource.setUser(loggingConnectionInfo.getUser());
connectionSource.setPassword(loggingConnectionInfo.getPassword());
connectionSource.setContext(lc);
connectionSource.start();
dbAppender.setConnectionSource(connectionSource);
dbAppender.start();
logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
logger.setLevel(Level.DEBUG);
logger.addAppender(dbAppender);
Run Code Online (Sandbox Code Playgroud)
知道什么可能是错的吗?我在控制台上看到了一个日志,但没有任何内容进入数据库.已经有一段时间与这个战斗,并将欣赏任何见解!
如何设置aop MethodInterceptor以使用Jersey资源?
以下是我已经试过,以下这个文件:
第1步 - InterceptionService
public class MyInterceptionService implements InterceptionService
{
private final Provider<AuthFilter> authFilterProvider;
@Inject
public HK2MethodInterceptionService(Provider<AuthFilter> authFilterProvider)
{
this.authFilterProvider = authFilterProvider;
}
/**
* Match any class.
*/
@Override
public Filter getDescriptorFilter()
{
return BuilderHelper.allFilter();
}
/**
* Intercept all Jersey resource methods for security.
*/
@Override
@Nullable
public List<MethodInterceptor> getMethodInterceptors(final Method method)
{
// don't intercept methods with PermitAll
if (method.isAnnotationPresent(PermitAll.class))
{
return null;
}
return Collections.singletonList(new MethodInterceptor()
{
@Override
public Object invoke(MethodInvocation …Run Code Online (Sandbox Code Playgroud)