io.reactivex.Single#zip ( )源码实例Demo

下面列出了io.reactivex.Single#zip ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

protected Single<Map<ReferenceType, Map<Permission, Set<Acl>>>> findAllPermissions(User user, String organizationId, String environmentId, String domainId, String applicationId) {

        List<Single<Map<Permission, Set<Acl>>>> permissionObs = new ArrayList<>();

        permissionObs.add(applicationId != null ? permissionService.findAllPermissions(user, ReferenceType.APPLICATION, applicationId) : Single.just(emptyMap()));
        permissionObs.add(domainId != null ? permissionService.findAllPermissions(user, ReferenceType.DOMAIN, domainId) : Single.just(emptyMap()));
        permissionObs.add(environmentId != null ? permissionService.findAllPermissions(user, ReferenceType.ENVIRONMENT, environmentId) : Single.just(emptyMap()));
        permissionObs.add(organizationId != null ? permissionService.findAllPermissions(user, ReferenceType.ORGANIZATION, organizationId) : Single.just(emptyMap()));

        return Single.zip(permissionObs, objects -> {
            Map<ReferenceType, Map<Permission, Set<Acl>>> permissionsPerType = new HashMap<>();
            permissionsPerType.put(ReferenceType.APPLICATION, (Map<Permission, Set<Acl>>) objects[0]);
            permissionsPerType.put(ReferenceType.DOMAIN, (Map<Permission, Set<Acl>>) objects[1]);
            permissionsPerType.put(ReferenceType.ENVIRONMENT, (Map<Permission, Set<Acl>>) objects[2]);
            permissionsPerType.put(ReferenceType.ORGANIZATION, (Map<Permission, Set<Acl>>) objects[3]);

            return permissionsPerType;
        });
    }
 
源代码2 项目: klingar   文件: MusicRepositoryImpl.java
@Override public Single<List<PlexItem>> browseMediaType(MediaType mt, int offset) {
  Single<List<PlexItem>> browseItems;

  if (mt.type() == Type.ARTIST) {
    browseItems = browseArtists(mt, offset);
  } else if (mt.type() == Type.ALBUM) {
    browseItems = browseAlbums(mt, offset);
  } else {
    browseItems = browseTracks(mt, offset);
  }

  return Single.zip(browseHeaders(mt), browseItems, (headers, items) -> {
    List<PlexItem> plexItems = new ArrayList<>();

    for (int i = 0; i < items.size(); ++i) {
      // The headers need to be offset by the current offset!
      if (headers.containsKey(i + offset)) {
        plexItems.add(headers.get(i + offset));
      }
      plexItems.add(items.get(i));
    }

    return plexItems;
  });
}
 
源代码3 项目: mvvm-template   文件: StarredViewModel.java
@Override
protected void callApi(int page, OnCallApiDone<Repo> onCallApiDone) {
    Single<Pageable<Repo>> single;
    if (staredCount != null && (staredCount.getValue() == null || staredCount.getValue() < 0)) {
         single = Single.zip(userRestService.getStarred(targetUser, page),
                userRestService.getStarredCount(targetUser), (repoPageable, count) -> {
                    if (count != null){
                        staredCount.setValue(count.getLast());
                    }
                    return repoPageable;
                });
    } else {
        single = userRestService.getStarred(targetUser, page);
    }
    execute(true, single, repoPageable -> {
        onCallApiDone.onDone(repoPageable.getLast(), page == 1, repoPageable.getItems());
    });
}
 
源代码4 项目: Melophile   文件: MusicRemoteSource.java
@Override
public Single<List<PlaylistEntity>> getPlaylistsBy(List<String> categories) {
  if (categories != null) {
    Single<List<PlaylistEntity>> start = Single.just(new LinkedList<>());
    for (String category : categories) {
      start = Single.zip(start, service.searchPlaylists(PlaylistEntity
              .Filter.start()
              .byName(category)
              .limit(100)
              .createOptions())
              .onErrorResumeNext(Single.just(new ArrayList<>())), (first, second) -> {
        if (second != null) {
          first.addAll(second);
        }
        return first;
      });
    }
    return start.map(filter::filterPlaylists);
  }
  return Single.error(new IllegalArgumentException("categories are null"));
}
 
源代码5 项目: Melophile   文件: MusicRemoteSource.java
@Override
public Single<List<TrackEntity>> getTracksBy(List<String> categories) {
  if (categories != null) {
    Single<List<TrackEntity>> start = Single.just(new LinkedList<>());
    for (String category : categories) {
      start = Single.zip(start, service.searchTracks(TrackEntity
              .Filter.start()
              .byTags(category)
              .createOptions())
              .onErrorResumeNext(Single.just(new ArrayList<>())), (first, second) -> {
        if (second != null) {
          first.addAll(second);
        }
        return first;
      });
    }
    return start.map(filter::filterTracks);
  }
  return Single.error(new IllegalArgumentException("categories are null"));
}
 
源代码6 项目: Melophile   文件: MusicRemoteSource.java
@Override
public Single<UserDetailsEntity> getUserBy(String id) {
  if (id != null) {
    Single<List<TrackEntity>> singleTracks = service.fetchUserTracks(id)
            .subscribeOn(schedulerProvider.multi());
    Single<List<PlaylistEntity>> singlePlaylists = service.fetchUserPlaylists(id)
            .subscribeOn(schedulerProvider.multi());
    Single<UserEntity> singleUser = service.fetchUser(id)
            .subscribeOn(schedulerProvider.multi());
    return Single.zip(singleUser,
            singleTracks.onErrorResumeNext(Single.just(new ArrayList<>())),
            singlePlaylists.onErrorResumeNext(Single.just(new ArrayList<>())),
            (user, tracks, playlists) -> {
              UserDetailsEntity userDetails = new UserDetailsEntity();
              userDetails.setUserEntity(user);
              userDetails.setTracks(filter.filterTracks(tracks));
              userDetails.setPlaylists(filter.filterPlaylists(playlists));
              return userDetails;
            });

  }
  return Single.error(new IllegalArgumentException("id is null"));
}
 
@Override
public Single<Map<String, Map<String, Object>>> getMetadata(List<Resource> resources) {
    if (resources == null || resources.isEmpty()) {
        return Single.just(Collections.emptyMap());
    }

    List<String> userIds = resources.stream().filter(resource -> resource.getUserId() != null).map(Resource::getUserId).distinct().collect(Collectors.toList());
    List<String> appIds = resources.stream().filter(resource -> resource.getClientId() != null).map(Resource::getClientId).distinct().collect(Collectors.toList());

    return Single.zip(userService.findByIdIn(userIds), applicationService.findByIdIn(appIds), (users, apps) -> {
        Map<String, Map<String, Object>> metadata = new HashMap<>();
        metadata.put("users", users.stream().collect(Collectors.toMap(User::getId, this::filter)));
        metadata.put("applications", apps.stream().collect(Collectors.toMap(Application::getId, this::filter)));
        return metadata;
    });
}
 
@Override
public Single<Map<String, Map<String, Object>>> getMetadata(List<Membership> memberships) {
    if (memberships == null || memberships.isEmpty()) {
        return Single.just(Collections.emptyMap());
    }

    List<String> userIds = memberships.stream().filter(membership -> MemberType.USER.equals(membership.getMemberType())).map(Membership::getMemberId).distinct().collect(Collectors.toList());
    List<String> groupIds = memberships.stream().filter(membership -> MemberType.GROUP.equals(membership.getMemberType())).map(Membership::getMemberId).distinct().collect(Collectors.toList());
    List<String> roleIds = memberships.stream().map(Membership::getRoleId).distinct().collect(Collectors.toList());

    return Single.zip(userService.findByIdIn(userIds), groupService.findByIdIn(groupIds), roleService.findByIdIn(roleIds), (users, groups, roles) -> {
        Map<String, Map<String, Object>> metadata = new HashMap<>();
        metadata.put("users", users.stream().collect(Collectors.toMap(io.gravitee.am.model.User::getId, this::convert)));
        metadata.put("groups", groups.stream().collect(Collectors.toMap(Group::getId, this::convert)));
        metadata.put("roles", roles.stream().collect(Collectors.toMap(Role::getId, this::filter)));
        return metadata;
    });
}
 
/**
 * Enhance user information with roles and groups if the access token contains those scopes
 * @param user The end user
 * @param accessToken The access token with required scopes
 * @return enhanced user
 */
private Single<User> enhance(User user, JWT accessToken) {
    return Single.zip(
            loadRoles(user, accessToken) ? roleService.findByIdIn(user.getRoles()).map(Optional::of) : Single.just(Optional.<Set<Role>>empty()),
            loadGroups(accessToken) ? groupService.findByMember(user.getId()).map(Optional::of) : Single.just(Optional.<List<Group>>empty()),
            (optionalRoles, optionalGroups) -> {
                Map<String, Object> userClaims = user.getAdditionalInformation() == null ? new HashMap<>() : new HashMap<>(user.getAdditionalInformation());
                if (optionalRoles.isPresent() && !optionalRoles.get().isEmpty()) {
                    Set<Role> roles = optionalRoles.get();
                    userClaims.putIfAbsent(CustomClaims.ROLES, roles.stream().map(Role::getName).collect(Collectors.toList()));
                }
                if (optionalGroups.isPresent() && !optionalGroups.get().isEmpty()) {
                    List<Group> groups = optionalGroups.get();
                    userClaims.putIfAbsent(CustomClaims.GROUPS, groups.stream().map(Group::getName).collect(Collectors.toList()));
                }
                user.setAdditionalInformation(userClaims);
                return user;
            });
}
 
@Override
public Single<Page<Application>> search(String domain, String query, int page, int size) {
    // currently search on client_id field
    Bson searchQuery = or(eq(FIELD_CLIENT_ID, query), eq(FIELD_NAME, query));
    // if query contains wildcard, use the regex query
    if (query.contains("*")) {
        String compactQuery = query.replaceAll("\\*+", ".*");
        String regex = "^" + compactQuery;
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        searchQuery = or(new BasicDBObject(FIELD_CLIENT_ID, pattern), new BasicDBObject(FIELD_NAME, pattern));
    }

    Bson mongoQuery = and(
            eq(FIELD_DOMAIN, domain),
            searchQuery);

    Single<Long> countOperation = Observable.fromPublisher(applicationsCollection.countDocuments(mongoQuery)).first(0l);
    Single<Set<Application>> applicationsOperation = Observable.fromPublisher(applicationsCollection.find(mongoQuery).sort(new BasicDBObject(FIELD_UPDATED_AT, -1)).skip(size * page).limit(size)).map(this::convert).collect(HashSet::new, Set::add);
    return Single.zip(countOperation, applicationsOperation, (count, applications) -> new Page<>(applications, page, count));
}
 
源代码11 项目: vertx-in-action   文件: CollectorService.java
private Single<JsonObject> collectTemperatures() {
  Single<HttpResponse<JsonObject>> r1 = fetchTemperature(3000);
  Single<HttpResponse<JsonObject>> r2 = fetchTemperature(3001);
  Single<HttpResponse<JsonObject>> r3 = fetchTemperature(3002);

  return Single.zip(r1, r2, r3, (j1, j2, j3) -> {
    JsonArray array = new JsonArray()
      .add(j1.body())
      .add(j2.body())
      .add(j3.body());
    return new JsonObject().put("data", array);
  });
}
 
@Override
public Single<Page<Audit>> search(ReferenceType referenceType, String referenceId, AuditReportableCriteria criteria, int page, int size) {
    // build query
    Bson query = query(referenceType, referenceId, criteria);

    // run search query
    Single<Long> countOperation = Observable.fromPublisher(reportableCollection.countDocuments(query)).first(0l);
    Single<List<Audit>> auditsOperation = Observable.fromPublisher(reportableCollection.find(query).sort(new BasicDBObject(FIELD_TIMESTAMP, -1)).skip(size * page).limit(size)).map(this::convert).collect(LinkedList::new, List::add);
    return Single.zip(countOperation, auditsOperation, (count, audits) -> new Page<>(audits, page, count));
}
 
源代码13 项目: alpha-wallet-android   文件: TokenRepository.java
private SingleTransformer<Token[], Token[]> attachDefaultTokens(Wallet wallet)
{
    return upstream -> Single.zip(
            upstream, ethereumNetworkRepository.getBlankOverrideTokens(wallet),
            (tokens, defaultTokens) ->
            {
                List<Token> result = mergeTokens(tokens, defaultTokens);
                return result.toArray(new Token[0]);
            });
}
 
源代码14 项目: alpha-wallet-android   文件: TokenRepository.java
private SingleTransformer<Token[], Token[]> attachEthereumStored(Wallet wallet)
{
    return upstream -> Single.zip(
            upstream, attachCachedEth(wallet),
            (tokens, ethTokens) ->
            {
                List<Token> result = new ArrayList<>();
                result.addAll(ethTokens);
                for (Token t : tokens) if (!t.isEthereum()) result.add(t);
                return result.toArray(new Token[0]);
            });
}
 
源代码15 项目: FCM-for-Mojo   文件: DiscussWhitelistActivity.java
@Override
public Single<? extends WhitelistState> startFetchWhitelistState() {
    return Single.zip(FFMService.getDiscussWhitelist(), OpenQQService.getDiscussesInfo(),
            (state, groups) -> {
                state.generateStates(groups);
                return state;
            });
}
 
源代码16 项目: NovelReader   文件: RxUtils.java
public static <T> Single<DetailBean<T>> toCommentDetail(Single<T> detailSingle,
                                            Single<List<CommentBean>> bestCommentsSingle,
                                            Single<List<CommentBean>> commentsSingle){
    return Single.zip(detailSingle, bestCommentsSingle, commentsSingle,
            new Function3<T, List<CommentBean>, List<CommentBean>, DetailBean<T>>() {
                @Override
                public DetailBean<T> apply(T t, List<CommentBean> commentBeen,
                                           List<CommentBean> commentBeen2) throws Exception {
                    return new DetailBean<T>(t,commentBeen,commentBeen2);
                }
            });
}
 
源代码17 项目: dhis2-android-sdk   文件: ConfigCase.java
public Single<SmsConfig> getSmsModuleConfig() {
    return Single.zip(
            localDbRepository.isModuleEnabled(),
            localDbRepository.getGatewayNumber(),
            localDbRepository.getWaitingForResultEnabled(),
            localDbRepository.getConfirmationSenderNumber(),
            localDbRepository.getWaitingResultTimeout(),
            SmsConfig::new
    );
}
 
@Override
public Single<Page<Application>> findAll(int page, int size) {
    Single<Long> countOperation = Observable.fromPublisher(applicationsCollection.countDocuments()).first(0l);
    Single<Set<Application>> applicationsOperation = Observable.fromPublisher(applicationsCollection.find().sort(new BasicDBObject(FIELD_UPDATED_AT, -1)).skip(size * page).limit(size)).map(this::convert).collect(HashSet::new, Set::add);
    return Single.zip(countOperation, applicationsOperation, (count, applications) -> new Page<>(applications, page, count));
}
 
@Override
public Single<Page<Application>> findByDomain(String domain, int page, int size) {
    Single<Long> countOperation = Observable.fromPublisher(applicationsCollection.countDocuments(eq(FIELD_DOMAIN, domain))).first(0l);
    Single<Set<Application>> applicationsOperation = Observable.fromPublisher(applicationsCollection.find(eq(FIELD_DOMAIN, domain)).sort(new BasicDBObject(FIELD_UPDATED_AT, -1)).skip(size * page).limit(size)).map(this::convert).collect(HashSet::new, Set::add);
    return Single.zip(countOperation, applicationsOperation, (count, applications) -> new Page<>(applications, page, count));
}
 
@Override
public Single<Page<User>> findAll(ReferenceType referenceType, String referenceId, int page, int size) {
    Single<Long> countOperation = Observable.fromPublisher(usersCollection.countDocuments(and(eq(FIELD_REFERENCE_TYPE, referenceType.name()), eq(FIELD_REFERENCE_ID, referenceId)))).first(0l);
    Single<Set<User>> usersOperation = Observable.fromPublisher(usersCollection.find(and(eq(FIELD_REFERENCE_TYPE, referenceType.name()), eq(FIELD_REFERENCE_ID, referenceId))).sort(new BasicDBObject(FIELD_USERNAME, 1)).skip(size * page).limit(size)).map(this::convert).collect(LinkedHashSet::new, Set::add);
    return Single.zip(countOperation, usersOperation, (count, users) -> new Page<>(users, page, count));
}